在 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"
.
代码:
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"
.