Tag: compiler warnings

在#include指令结束时禁止GCC警告“额外令牌”

我正在用C语言编写一个程序,用于在HP NonStop机器上编译和运行。 但是,我想在运行Linux的工作站上进行主要开发。 HP NonStop C编译器需要非标准的#include指令,如下所示: #include nolist 对于每个#include指令,我的工作站的GCC抱怨: S88USF.c:139:21: warning: extra tokens at end of #include directive 我该怎样抑制这个特别警告? 注意:在SO上,已经提出了类似的问题,正确的答案是“不要让gcc首先抱怨任何理由”。 但是,在这种情况下,我明确地希望完全按原样使用#include指令。 我知道我在做什么,我只是不知道如何通知gcc。

当在“while” – C中使用常量时,为什么MSVC会生成警告C4127

对于代码, while(1) { /* ….. */ } MSVC生成以下警告。 warning C4127: conditional expression is constant 警告的MSDN页面建议for(;;)而不是while(1) 。 我想知道for(;;)有什么好处for(;;)以及为什么它会在while不断使用? 我应该在GCC上使用什么标志来获得相同的警告?

在64位拱上投射指向整数问题警告的指针

我正在编写一个使用导出符号open_exec的linux内核模块 struct file *open_exec(const char *name) 它返回一个指针,我可以检查IS_ERR宏的错误: if (IS_ERR(file)) return file; 在编译期间,我收到此警告: warning: return makes integer from pointer without a cast 这是因为我的函数返回一个整数。 如果我尝试施放它: return (int) file; 我没有在我的32位机器上收到警告,但我在我的64位机器上发出警告: warning: cast from pointer to integer of different size 这是因为int和指针的sizeof在32位上是相同的,但它们在64位机器上是不同的。 无论是否投射,代码似乎都有效。 我只是想摆脱警告。 如何正确地转换指向整数的指针并获得我期望的值,同时没有得到编译器警告? 我期望的值本质上是linux内核代码库的include/asm-generic/errno-base.h中列出的整数。 由于我只是在IS_ERR()为真的情况下将指针看作是一个整数,我可以肯定它实际上只保存一个整数值。

避免在printf的包装中发出警告

我正在编写的小C库中有一个错误报告function。 除了普通errorfunction之外,我还想提供一个errorf函数,以便轻松地在错误消息中嵌入信息。 /* * Prints a formatted error message. Use it as you would use ‘printf’. See the * ‘sio_error’ function. */ void sio_errorf(const char *format, …) { // Print the error prefix if (g_input == STDIN) fputs(“error: “, stderr); else fprintf(stderr, “%s: “, g_progname); // Pass on the varargs on to ‘vfprintf’. va_list arglist; […]

让编译器检查数组初始值设定项的数量

初始化一个数组(在C ++中,但任何适用于C的解决方案也可能在这里工作)使用较少的初始化器而不是元素是完全合法的: int array[10] = { 1, 2, 3 }; 但是,这可能是一些模糊的错误。 有没有办法让编译器(gcc)检查一个特定数组的初始值设定项的数量,如果声明和实际大小不匹配,则发出警告甚至错误? 我知道我可以使用int array[] = { 1, 2, 3 }; 然后可以使用涉及sizeof(array)静态断言来validation我的期望。 但我在其他翻译单元中使用array ,所以我必须用明确的大小声明它。 所以这个技巧对我不起作用。

为什么>> 24导致-Wconversion但是>> 23不?

这是代码: #include unsigned char f(uint32_t RGBA) { return (RGBA>>24) & 0xFF; } 当使用-Wconversion编译时,它会导致“警告:从’uint32_t {aka unsigned int}’转换为’unsigned char”可能会改变其值[-Wconversion]”。 如果我将移位值降低到23或更低,则警告消失。 我查看了C99标准,我不明白这里发生了什么。 如果我删除&运算符,则总是发出警告,这可能是好的,因为表达式(在整数提升之后)的结果大于unsigned char 。 我唯一的想法是,对于较小的class次省略警告只是因为gcc是聪明的并且无论如何都看到结果是8位,因为标准不会使这成为特殊情况。 我在这儿吗? 为什么class次价值很重要? 这是GCC的错误吗? Clang似乎没有为任何class次值发出警告。 我在64位Linux系统上使用GCC 5.3.1。

为什么编译器没有警告我一个空的if语句?

我正在使用Keil uVision v4.74并启用了“All Warnings”选项。 我写了以下故意代码: if(condition matched) { //do something } 当我重建我的项目时,我得到0个错误,0个警告。 但是,当我不小心写道: if(condition matched); { //do something } 我也有0个错误,0个警告。 我几乎不可能发现那么小; if条件之后是问题的根源。 为什么编译器不将它视为警告并通知我?

我应该使用哪些编译标志来避免运行时错误

刚刚在这里了解到-Wsequence-point comiplation标志会在代码调用UB时弹出警告。 我在类似的声明上尝试过 int x = 1; int y = x+ ++x; 它工作得非常好。 到目前为止,我只使用-ansi -pedantic -Wall编译gcc或g++ 。 你有没有其他有用的标志来使代码更安全和健壮?