使用arm-none-eabi-gcc的isprint()的奇怪错误消息

时间:2019-09-03 23:50:21

标签: gcc arm avr-gcc

我有以下代码:

#include <ctype.h>

void myfn(void)
{
    uint8_t any0 = 'c';
    char any1 = 'c';

    if (isprint(any0))
    {
        return;
    }
    if (isprint(any1))
    {
        return;
    }
}

当我用gcc编译arm时,出现以下错误:

error: array subscript has type 'char' [-Werror=char-subscripts]
     if (isprint(any1))
     ^

如果我将unit8_t传递给isprint,则编译器会感到高兴,但如果我将char传递给它,则不会。

isprint的原型为:

int isprint(int c);

它期望一个int作为参数,我给它一个char。 我希望它会抱怨参数的类型,但不会抱怨与“数组下标”无关的东西。

如果我将呼叫更改为:错误消失了

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'

如果我使用gcc编译器为AVR /usr/bin/avr-gcc编译了相同的代码(使用相似的命令行选项,并且我有意添加了选项-Werror=char-subscripts),它不会抱怨isprint。因此,这似乎与ARM编译器有关。

1 个答案:

答案 0 :(得分:0)

事实证明,isprint的ARM实现是一个宏,更重要的是头文件ctype.h包含以下注释:

These macros are intentionally written in a manner that will trigger
a gcc -Wall warning if the user mistakenly passes a 'char' instead of
an int containing an 'unsigned char'.

对于AVR,头文件ctype.h包含:

extern int isprint(int __c) __ATTR_CONST__;

这说明了为AVR或ARM进行编译时行为的差异。