将无符号的char指针传递给atoi而不进行强制转换
在某些嵌入式设备上,我已经将一个unsigned char
指针传递给atoi
而没有 atoi
。
unsigned char c[10]="12"; atoi(c);
问题:它定义明确吗?
我看到某处字符串函数可以,但是对atoi
不确定。
编辑:顺便说一句。 对于下面的答案之一已经表达了一些担忧,即使对于字符串函数(例如strcpy)也可能不行 – 但如果我说得对(?),作者也意味着在实践中这可能是正常的。
另外,我在这里,是否可以执行以下对unsigned char
指针的分配 ? 因为我使用了一些抱怨“类型不匹配(赋值)(ptrs to signed / unsigned)”的工具“
unsigned char *ptr = strtok(unscharbuff,"-"); // is assignment also ok to unsigned char?
不,它没有明确定义。 这是一个约束违规,需要编译时诊断。 在实践中,它很可能像你期望的那样工作,但不能保证这样做,而恕我直言,它的风格很差。
atoi
函数在
声明为:
int atoi(const char *nptr);
您将unsigned char*
参数传递给需要char*
参数的函数。 这两种类型不兼容,并且没有从一个到另一个的隐式转换。 符合标准的编译器可以发出警告(计为诊断),然后继续生成可执行文件,但该可执行文件的行为未定义。
从C99开始,对没有可见声明的函数的调用是违反约束的,所以你不能通过省略#include
来逃避它。
C仍然允许调用具有可见声明的函数,其中声明不是原型(即,没有定义参数的类型数)。 因此,您可以添加自己的声明,而不是通常的#include
:
int atoi();
这将允许使用unsigned char*
参数调用它。
这几乎肯定会“起作用”,并且有可能从标准中构造一个其行为定义明确的论证。 '1'
和'2'
的char
和unsigned char
值保证具有相同的表示forms
但是添加演员要容易得多,而不是certificate它没有必要 – 或者更好的是,将c
定义为char
数组而不是unsigned char
数组,因为它打算保存一个字符串。
unsigned char *ptr = strtok(unscharbuff,"-");
这也是违反约束的行为。 对于strtok
调用中的第一个参数,没有从unsigned char*
到char*
的隐式转换,并且没有从char*
到unsigned char*
隐式转换,用于初始化ptr
。
是的,这些function完全正常。 您的编译器设置将确定您是否收到有关类型的警告。 我通常使用-Wall编译,打开所有警告,然后在代码中为每个案例使用静态强制转换,以便我知道我已经仔细检查过它们。 最终结果是零错误和零警告,并且任何在将来触发警告的更改都将非常突出,而不会在100个容错消息中丢失。