1

本着忽略的后果是什么:警告:未使用的参数,但我有未使用的静态函数,

#include <stdlib.h> /* EXIT_SUCCESS */
#include <stdio.h>  /* fprintf */

#define ANIMAL Sloth
#include "Animal.h"

#define ANIMAL Llama
#include "Animal.h"

int main(void) {
    printf("%s\n%s\n%s\n%s\n%s\n", HelloSloth(), SleepySloth(), HelloLlama(),
        GoodbyeSloth(), GoodbyeLlama());
    return EXIT_SUCCESS;
}

static void foo(void) {
}

动物.h

#ifndef ANIMAL
#error ANIMAL is undefined.
#endif

#ifdef CAT
#undef CAT
#endif
#ifdef CAT_
#undef CAT_
#endif
#ifdef A_
#undef A_
#endif
#ifdef QUOTE
#undef QUOTE
#endif
#ifdef QUOTE_
#undef QUOTE_
#endif
#define CAT_(x, y) x ## y
#define CAT(x, y) CAT_(x, y)
#define A_(thing) CAT(thing, ANIMAL)
#define QUOTE_(name) #name
#define QUOTE(name) QUOTE_(name)

static const char *A_(Hello)(void) { return "Hello " QUOTE(ANIMAL) "!"; }
static const char *A_(Goodbye)(void) { return "Goodbye " QUOTE(ANIMAL) "."; }
static const char *A_(Sleepy)(void) { return QUOTE(ANIMAL) " is sleeping."; }

#undef ANIMAL

我绝对希望SleepyLlama被聪明的编译器检测为未使用并从代码中优化。我不想听到它;潜在地,当我扩展到越来越ANIMAL多的动作时,它会变得分散注意力。但是,我不想干扰关于foo未使用的可能警告。

MSVC(14) has #pragma warning(push),但显然不检查;gcc(4.2) 并且clang-Wunused-function. 我已经尝试过https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html但它们似乎不适用于功能。foo有没有办法SleepyLlama在不同的编译器之间获取所有警告?

4

1 回答 1

3

不是一种禁用警告的方法,但您可以通过实际使用它们来抑制未使用的警告。

在您animals.h添加的行 -

static const char *A_(DummyWrapper)(void) {
    (void)A_(Hello)(); 
    (void)A_(Goodbye)(); 
    (void)A_(Sleepy)(); 
    (void)A_(DummyWrapper)(); 
}

这应该使编译器不会抱怨未使用的函数。

于 2017-05-08T08:37:05.883 回答