在 Clang 编译器使用 printf 打印时从宏 'num' 扩展

Expanded from macro 'num' while printing it using printf by Clang compiler

代码:

char *color_name[] = {
    "red",
    "blue",
    "green"
};

#define color_num (sizeof(color_name)/sizeof(char*))

int main(){
    printf("size %d \n",color_num);
    return 0;
}

它在 Centos 7 上与 GCC 4.8.2 一起工作正常。

但是我在 mac 上面的程序中遇到了错误 运行,上面写着:

note:expanded from macro 'color_num'

我的 Mac 上的编译器:

……include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

有人告诉我 GCC 在 Mac 上链接到 Clang 用于编译程序,对吗?

问题:

那么为什么 Clang 会报那个错误呢?是关于预处理吗?

如果我这样做,效果很好:

int a = color_num;
printf("%d\n",a);

或:

printf("%d\n",sizeof(color_num)/sizeof(char*));

更新数据=============

Crayon_277@Macintosh 20150525$ gcc -g -o ex11 ex1.c
ex1.c:16:21: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
        printf("size %d\n",color_num);
                     ~~    ^~~~~~~~~
                     %lu
ex1.c:14:19: note: expanded from macro 'color_num'
#define color_num (sizeof(color)/sizeof(char*))
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

似乎没有错误,只是格式警告。

我认为这可能与我用于 vim 的扩展有关 scrooloose/syntastic

我从中得到错误:

可能是在抱怨从 color_num 展开的表达式是无符号的(可能是无符号长整型),而 printf 中的格式是有符号整数。

sizeof 给出 size_t,它始终是无符号类型,如 is size_t always unsigned? 中所述,但位数取决于实施。编译器警告可能——而且经常如此——指的是等效类型的不匹配,而不是 size_t 本身。毕竟 C 标准没有指定诊断消息的性质。

当您将其更改为赋值时,它就不那么严格了,因为那是不同的检查。

"note" 行是编译器 添加 到 warning/error 消息中的内容,以帮助您了解问题的来源。

(如评论所述,您应该引用整个警告消息,以使问题易于理解)。

sizeof 给出 size_t 类型的值,size_t 的正确格式说明符是 "%zu".