如何让 gcc 抱怨 char 与 256 的比较
How to make gcc complain about comparison of char with 256
我在 codegolf.stackexchange 上找到了以下代码,用于为 ASCII 字符打印代码 table:
#include <stdio.h>
int main(){
char i;
for(i = 0; i < 256; i++){
printf("%3d 0x%2x: %c\n", i, i, i);
}
return 0;
}
因为 char
s 在其中存储单个字节,所以它们总是 < 256
并且循环永远不会终止。我想在编译时检测到这一点。
很好,clang
发出以下警告:
a.c:5:18: warning: comparison of constant 256 with expression of type 'char' is always true [-Wtautological-constant-out-of-range-compare]
for(i = 0; i < 256; i++){
~ ^ ~~~
然而,gcc
和 gcc -Wall
都没有给出任何类型的警告。我可以提供任何一组命令行选项来打开这种警告吗?或者在 gcc 中是不可能的?
-Wtype-limits
(或-Wextra
)应触发此警告
添加 -Wextra
和 -Wconversion
。第一个包括针对您的实际问题的警告,但后者将警告许多其他相关问题。
但请注意:如果您的代码编写不当(signed/unsigned 等),-Wconversion
也会警告许多其他潜在问题。最好是编译,查看警告并仔细验证列出的行,可能添加强制转换(如果代码正确,请考虑三次!)。
我在 ubuntu 14.04 linux 上使用 gcc 编译了发布的代码:
-Wall -Wextra -pedantic -std=c99
并且编译器输出此警告:
warning: comparison is always true due to limited range of data type [-Wtype-limits]
编译时始终启用所有警告的又一个原因
我在 codegolf.stackexchange 上找到了以下代码,用于为 ASCII 字符打印代码 table:
#include <stdio.h>
int main(){
char i;
for(i = 0; i < 256; i++){
printf("%3d 0x%2x: %c\n", i, i, i);
}
return 0;
}
因为 char
s 在其中存储单个字节,所以它们总是 < 256
并且循环永远不会终止。我想在编译时检测到这一点。
很好,clang
发出以下警告:
a.c:5:18: warning: comparison of constant 256 with expression of type 'char' is always true [-Wtautological-constant-out-of-range-compare]
for(i = 0; i < 256; i++){
~ ^ ~~~
然而,gcc
和 gcc -Wall
都没有给出任何类型的警告。我可以提供任何一组命令行选项来打开这种警告吗?或者在 gcc 中是不可能的?
-Wtype-limits
(或-Wextra
)应触发此警告
添加 -Wextra
和 -Wconversion
。第一个包括针对您的实际问题的警告,但后者将警告许多其他相关问题。
但请注意:如果您的代码编写不当(signed/unsigned 等),-Wconversion
也会警告许多其他潜在问题。最好是编译,查看警告并仔细验证列出的行,可能添加强制转换(如果代码正确,请考虑三次!)。
我在 ubuntu 14.04 linux 上使用 gcc 编译了发布的代码:
-Wall -Wextra -pedantic -std=c99
并且编译器输出此警告:
warning: comparison is always true due to limited range of data type [-Wtype-limits]
编译时始终启用所有警告的又一个原因