Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中抑制未使用的变量警告+=&燃气轮机;编译器错误还是代码错误?_C++_Templates_Language Lawyer_Member Variables - Fatal编程技术网

C++ 在C+中抑制未使用的变量警告+=&燃气轮机;编译器错误还是代码错误?

C++ 在C+中抑制未使用的变量警告+=&燃气轮机;编译器错误还是代码错误?,c++,templates,language-lawyer,member-variables,C++,Templates,Language Lawyer,Member Variables,目前,我正在使用以下函数模板来抑制未使用的变量警告: template<typename T> void unused(T const &) { /* Do nothing. */ } unused的参数是一个声明为: volatile bool readWriteActivated; 这是编译器错误还是代码中的错误 以下是最基本的测试用例: template<typename T> void unused(T const &) { } in

目前,我正在使用以下函数模板来抑制未使用的变量警告:

template<typename T>
void
unused(T const &) {
  /* Do nothing. */
}
unused的参数是一个声明为:

  volatile bool readWriteActivated;
这是编译器错误还是代码中的错误

以下是最基本的测试用例:

template<typename T>
void unused(T const &) { }

int main() {
  volatile bool x = false;
  unused(!x); // type of "!x" is bool
}
模板
无效未使用(T常数&){}
int main(){
挥发性bool x=假;
未使用(!x);//类型为bool的“!x”
}

在GCC中,可以按如下方式定义宏:

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif 

使用此宏标记的任何参数都将禁止GCC发出未使用的警告(并使用前缀
未使用的
重命名参数)。对于Visual Studio,可以使用
#pragma
指令抑制警告。

我不能100%确定这是可移植的,但这是我通常用于抑制有关未使用变量的警告的习惯用法。这里的上下文是一个信号处理程序,它只用于捕获
SIGINT
SIGTERM
,因此,如果调用函数,我知道是时候退出程序了

volatile bool app_killed = false;
int signal_handler(int signum)
{
    (void)signum; // this suppresses the warnings
    app_killed = true;
}

我倾向于不喜欢用“代码”>“AytAtEtTyx”((未使用)来参数列表,因为CAST无效的技巧不需要使用VisualC++的宏,

< P>实际的表示不实际使用参数的方法并没有给出它的名称:

int f(int a, float) {
     return a*2;
}

将在启用所有警告的情况下到处编译,而不会对未使用的浮点值发出警告。即使参数在原型中有名称(例如
intf(inta,float f);
),它也不会抱怨。

这是一个编译器错误,没有已知的解决方法:


它在v4.4中是固定的。

haavee提出的答案(由ur修订)是我通常使用的答案:

int f(int a, float /*epsilon*/) {
     return a*2;
}
真正的问题发生在方法中有时使用参数,但不总是使用参数时,例如:

int f(int a, float epsilon) {
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}
现在,我不能注释掉参数名epsilon,因为这将破坏我的日志构建(我不想在参数列表中插入另一个#ifdef,因为这会使代码更难阅读)

因此,我认为最好的解决办法是使用Tom的建议:

int f(int a, float epsilon) {
(void) epsilon;    // suppress compiler warning for possibly unused arg
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}

我唯一担心的是,一些编译器可能会对“(void)epsilon;”语句发出警告,例如“statement has not effect”或类似的警告-我想我只需要在可能使用的所有编译器上进行测试…

我无法重现该问题。你能发布代码复制的问题吗?WaleMKF-为什么你接受了一个你清楚地回答的问题并不能解决你的问题?是的,它既是合法C++又是可移植的。如果你想使这个方法与使用unUSED()的现有代码兼容,定义宏:<代码>定义未使用的(x)((空)x)如果变量是对不完整类型的引用,则此操作无效。例如,
struct a;void f(a&a){(void)a}
将给出一个编译错误。如果您不需要使用来签名,那么如果您只是将其作为一个未命名的参数。。。像这样:
int signal\u handler(int)
它将适合相同的原型,甚至可能保存一些内存,我通常使用int f(int count,float/*epsilon*/)之类的东西来命名未使用的参数及其含义。实际上,这是很好的方式,我忘了,但你绝对正确。+1。再加上你的建议,这是最干净、最有表现力的方式。这不是问题的所在。省略函数arg的变量名效果很好,但这里变量是在函数内部声明的,因此不能省略。在这种情况下,还需要变量名,因为它在某些#ifdef情况下使用,而未使用的用于else,因此不会生成警告。不命名参数的问题是,您可能需要稍后检查它们。当您试图在调试器中查看它们的值时,您会希望您给了它们名称。是的,但这取决于编译器。这个问题给出了一种不依赖于编译器的方式来实现这一点的常用方法,但是,如图所示,它在编译器中运行了一个bug。+1这是最可移植的答案。此外,gcc还支持
#pragma unused
——另请参见
\u pragma
指令的文档。
int f(int a, float epsilon) {
(void) epsilon;    // suppress compiler warning for possibly unused arg
#ifdef LOGGING_ENABLED
     LOG("f: a = %d, epsilon = %f\n", a, epsilon);
#endif
     return a*2;
}