我有一个跨平台应用程序,在我的一些函数中,并没有使用传递给函数的所有值.因此我收到GCC的警告,告诉我有未使用的变量.
编码警告的最佳编码方式是什么?
围绕这个功能的#ifdef?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Run Code Online (Sandbox Code Playgroud)
这太丑了,但似乎是编译器喜欢的方式.
或者我在函数末尾为变量赋值为零?(我讨厌它,因为它改变了程序流程中的某些东西以使编译器警告静音).
有正确的方法吗?
在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?
有时局部变量的唯一目的是在assert()中检查它,就像这样 -
int Result = Func();
assert( Result == 1 );
Run Code Online (Sandbox Code Playgroud)
在Release版本中编译代码时,通常会禁用assert(),因此此代码可能会生成有关Result已设置但从未读取的警告.
可能的解决方法是 -
int Result = Func();
if ( Result == 1 )
{
assert( 0 );
}
Run Code Online (Sandbox Code Playgroud)
但它需要太多的打字,在眼睛上并不容易,并且导致总是检查条件(是的,编译器可以优化检查,但仍然).
我正在寻找一种替代方法来表达这个assert()的方式不会导致警告,但仍然易于使用并避免更改assert()的语义.
(在此区域代码中使用#pragma禁用警告不是一种选择,并且降低警告级别以使其消失也不是一种选择......).
抑制编译器(在本例中为gcc)的最佳/最佳方法是什么,如"未使用的变量x" - 警告?
我不想给gcc提供任何特定的标志来删除所有这些警告,仅用于特殊情况.
在C++中,我倾向于在某些情况下省略参数的名称.但是在C中,当我省略参数的名字时出错了.
这是代码:
void foo(int); //forward-decl, it's OK to omit the parameter's name, in both C++ and C
int main()
{
foo(0);
return 0;
}
void foo(int) //definition in C, it cannot compile with gcc
{
printf("in foo\n");
}
void foo(int) //definition in C++, it can compile with g++
{
cout << "in foo" << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是为什么?我不能省略C函数定义中的参数名称吗?
当-Werror与clang一起使用时,它会将"警告:编译期间未使用的参数"消息转换为错误,这是有道理的.有-Qunused-arguments一面旗帜让他们完全沉默.我的问题是,是否有一些-Wno-error=...我可以传递的标志,使这些不是错误,而不是完全禁用它们?
抑制C编译器有关未使用变量的警告的一种众所周知的可移植方法是(参见C代码中未使用的参数警告):
#define UNUSED(x) (void)(x)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来概括它以获取多个输入(不同类型):
void foo(int a, long b, void* c){
/* Want this: */
ALL_UNUSED(a, b, c);
/* instead of: */
UNUSED(a);
UNUSED(b);
UNUSED(c);
}
Run Code Online (Sandbox Code Playgroud)
似乎可以解决的一种方法是使用可变参数函数
static inline void ALL_UNUSED(int dummy, ...) {}
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑这种解决方案在专家眼中是令人反感的.
是否有符合标准且可移植(即不使用__attribute__((unused)))的方式来制作可变参数UNUSED()函数/宏?非常感谢!
编辑
在C99或C预处理器的上下文中似乎没有一种干净的方式来执行我的要求.这就是人生.
在下面的回答中,@ Dabo展示了一种非常有趣的方式来做我要求使用的一系列宏.这是整洁和翔实的(至少对我来说),所以我接受这个答案.也就是说,我不会将它部署在一个大型项目中,因为它的篇幅足以超过它带来的好处(在我看来).但人们会在这里得出不同的结论.
如下所述,使用空可变参数函数的方法也不完美.虽然它是一个非常优雅的单行,但它会引发有关单元化变量的警告(如果是的话).此外,你必须相信你的编译器完全优化它,我原则上反对,但我尝试过的所有编译器实际上都是这样做的.
一个相关的情况是在早期高级接口设计阶段之后存根功能.那么你未使用的变量都将是函数参数并按定义初始化,以下方法可以正常工作
static inline void UNUSED(int dummy, ...) {}
void foo(int a, long b, void* c){
UNUSED(a, b, b); /* No warnings */
}
Run Code Online (Sandbox Code Playgroud) 从标题中可能不清楚.我在嵌入式STM32项目中遇到了以下代码.我不明白函数里面的行.
static void txend1(UARTDriver *uartp) {
(void)uartp; // what does this do? Is it a statement?
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在网上搜索其他地方,但大多数结果是指向void指针的指针,我不认为这是.谢谢您的帮助!
Fortran中抑制警告消息的最佳实践是什么,例如:
remark #7712: This variable has not been used.
Run Code Online (Sandbox Code Playgroud)
仅用于一个特定变量(API中我们不想破坏的想象函数)?
注2:gcc的相似之处:__attribute__((__unused__))或MACRO的其他常见C惯例
注意3:我对ifort尤其感兴趣,但是多编译器会更好。
有一些c ++代码
struct data {
/* some fields */
};
typedef struct data * pData;
int function(pData pointer) {
if(pointer == NULL)
return ERROR;
(void)pointer;
/* other work */
}
Run Code Online (Sandbox Code Playgroud)
"(void)指针"是什么意思?
仅供参考,有一些int/char*/etc,一些函数指针在结构中用作回调函数.
c ×6
c++ ×4
gcc ×3
warnings ×3
assertions ×1
clang ×1
compilation ×1
embedded ×1
fortran ×1
gcc-warning ×1
macros ×1
pointers ×1
pragma ×1
stm32 ×1