use*_*316 3 c arrays ctype compiler-warnings
我在C中有以下代码:
char input[127] = "hello world";
isxdigit(input[0]);
Run Code Online (Sandbox Code Playgroud)
但是我收到了以下警告:
warning: array subscript has type 'char'
Run Code Online (Sandbox Code Playgroud)
是什么原因以及如何解决?
原因是在C实现中,isxdigit()使用数组查找实现为宏.
只要输入字符串只包含字符<= 127,就可以使用强制转换修复它:
isxdigit ((int)input[0]);
Run Code Online (Sandbox Code Playgroud)
或者,如果你认为演员是丑陋的,借助于良性表达,例如加0:
isxdigit (0 + input[0]); /* Avoid cast by using an int-typed expression. */
isxdigit (+input[0]); /* Same thing using unary plus instead of addition. */
Run Code Online (Sandbox Code Playgroud)
由于C标准要求isxdigit也是一个函数,您也可以调用函数而不是宏:
(isxdigit)(input[0]);
Run Code Online (Sandbox Code Playgroud)
甚至
#undef isxdigit
isxdigit(input[0]);
Run Code Online (Sandbox Code Playgroud)
这应该不会产生任何警告,因为input[0]它被提升为int(假设事先#include <ctype.h>.)
正如cmaster正确指出的那样,这些解决方案一旦char签名并包含负值就会崩溃.在这种情况下,你必须首先施放unsigned char(然后int如果你想要).