我有以下代码:
#include <ctype.h>
void myfn(void)
{
uint8_t any0 = 'c';
char any1 = 'c';
if (isprint(any0))
{
return;
}
if (isprint(any1))
{
return;
}
}当我使用arm的gcc编译它时,我得到了以下错误:
error: array subscript has type 'char' [-Werror=char-subscripts]
if (isprint(any1))
^如果我将一个unit8_t传递给isprint,编译器会很高兴,但如果我传递一个char,编译器就不会高兴了。
isprint的原型是:
int isprint(int c);它需要一个int作为参数,我给它一个char。我希望它会抱怨参数的类型,但不会抱怨与'array subscript‘无关的东西。
如果我将调用更改为:
if (isprint((uint8_t)any1))是不是有什么我没注意到的?
我使用的编译器是:
GNU C (15:4.9.3+svn231177-1) version 4.9.3 20150529 (prerelease) (arm-none-eabi)
compiled by GNU C version 5.2.1 20151129, GMP version 6.1.0, MPFR version 3.1.3, MPC version 1.0.3
warning: MPFR header version 3.1.3 differs from library version 3.1.4.命令行选项:
'-v' '-fshort-enums' '-specs=nosys.specs' '-specs=nano.specs'
'-mfloat-abi=soft' '-save-temps' '-Werror' '-Wpedantic' '-pedantic-errors' '-mthumb' '-fno-builtin' '-mcpu=cortex-m0' '-Wall' '-std=gnu99' '-ffunction-sections'
'-fdata-sections' '-fomit-frame-pointer' '-mabi=aapcs' '-fno-unroll-loops' '-ffast-math' '-ftree-vectorize' '-Og' '-g'如果我用针对AVR /usr/bin/avr-gcc的gcc编译器编译相同的代码(使用类似的命令行选项,我故意添加了选项-Werror=char-subscripts),它不会抱怨isprint。因此,它似乎与ARM编译器有关。
发布于 2019-09-09 05:49:15
事实证明,ARM的isprint实现是一个宏,更重要的是,头文件ctype.h包含以下注释:
如果用户错误地传递了“
”而不是包含“unsigned char”的int,则这些宏是故意以某种方式编写的,该方式将触发一个“char”-Wall警告。
对于AVR,头文件ctype.h包含:
extern int isprint(int __c) __ATTR_CONST__;这解释了在为AVR或ARM编译时行为上的差异。
https://stackoverflow.com/questions/57779893
复制相似问题