Нет, это не совсем правильно. Это нарушение ограничений, требующее диагностики времени компиляции. На практике это очень вероятно, что вы будете работать, как вы ожидаете, но это не гарантируется, и ИМХО это плохой стиль.
atoi
функция объявлена в <stdlib.h>
как:
int atoi(const char *nptr);
Вы пропускание unsigned char*
аргумента функции, ожидающую char*
аргумента. Эти два типа несовместимы, и нет никакого неявного преобразования из одного в другое. Соответствующий компилятор может выдать предупреждение (которое считается диагностическим), а затем продолжить генерировать исполняемый файл, но поведение этого исполняемого файла не определено.
Начиная с C99, вызов функции без видимой декларации является нарушением ограничения, поэтому вы не можете избежать этого, опуская #include <stdlib.h>
.
C все же разрешает вызовы функций с видимым объявлением, где объявление не является прототипом (т. Е. Не определяет количество типов (типов) параметров). Таким образом, вместо обычного #include <stdlib.h>
, вы можете добавить свою собственную декларацию:
int atoi();
, который позволил бы называть его с unsigned char*
аргументом.
Это почти наверняка «работает», и может быть возможно построить аргумент из стандарта, чтобы его поведение было четко определено.В char
и unsigned char
значения '1'
и '2'
гарантированно иметь такое же представление
Но это гораздо проще добавить бросание чем доказать, что это не нужно - или, еще лучше, чтобы определить c
как массив char
а не как массив из unsigned char
, так как он предназначен для хранения строки.
unsigned char *ptr = strtok(unscharbuff,"-");
Это также является нарушением ограничения. Нет никакого неявного преобразования из unsigned char*
в char*
для первого аргумента в вызове strtok
, и нет никакого неявного преобразования из char*
в unsigned char*
для инициализации ptr
.
как я уже сказал, я не использовал литье; ps это компилятор для некоторого встроенного устройства. –
. Вы не использовали приведения, но вы должны сделать это, чтобы отключить предупреждения и запретить включение предупреждений ('-Wall'), чтобы получить полезные предостережения от компилятора. – chqrlie
@chqrlie: Хорошо, я не был уверен, как пройти -Wall к этому компилятору Я использую некоторый файл make и т. Д. Не был уверен, поддерживает ли этот компилятор -Wall? –