我喜欢用标志编译我的代码:
$gcc prog1.c -o prog1.x -Wall -Wextra -ansi -pedantic-errors -g -O0 -DDEBUG=1
并且为了避免-Wunused-result
我不喜欢添加另一个标志的想法:(-Wno-unused-result
如果你这样做,那就是一个解决方案)。
我曾经(void)
对某些函数进行转换(不是printf
或其他著名的,因为编译器不会警告它们,只是那些奇怪的)。现在投射到(void)
不再起作用(GCC 4.7.2)
有趣的夹板建议:
Result returned by function call is not used. If this is intended,
can cast result to (void) to eliminate message. (Use -retvalother to
inhibit warning)
但这不再是解决方案。Splint 需要有关此问题的更新。
因此,要以非常兼容的方式消除警告,这里有一个很好的方法MACRO
:
/** Turn off -Wunused-result for a specific function call */
#define igr(M) if(1==((long)M)){;}
并这样称呼它:
igr(PL_get_chars(t, &s, CVT_VARIABLE));
它看起来很干净,任何编译器都会消除代码。下面是我喜欢的编辑器的图片vi
:左窗口,没有igr()
;中间窗口,使用igr()
; 右侧窗口,来源。
你可以看到,它完全一样,一个完全无害的代码让 C 做 gcc 不允许做的事情:忽略返回码。
比较1==...
是必要的,只是为了避免这个条件为 no 的夹板警告BOOL
。GCC 不在乎。根据功能,您可能会收到cast
警告。我用这个 MACRO 做了一个忽略 a 的测试double
,这很好,但不知何故我并不完全相信。特别是如果函数返回一个指针或更复杂的东西。
在这种情况下,您还需要:
#define pigr(M) if(NULL==((void *)M)){;}
最后一件事:{;}
由于警告,这是必要的-Wempty-body
(建议在“if”语句中用大括号括住空主体)。
并且(现在是最后一件事);
函数调用之后不是(严格)必要的,而是它的好习惯。使您的代码行更加同质,所有代码行都以;
. (翻译成NOP
助记词,优化后消失)。
运行编译器不会给出警告或错误。运行splint
给出:
$ splint ./teste.c -I/usr/lib/swi-prolog/include/ -strict-lib
Splint 3.1.2 --- 20 Feb 2009
Finished checking --- no warnings
另请参阅此答案