C-对一部分代码的未使用的静态功能警告进行沉默



本着忽略的后果的精神:警告:未使用的参数,但我的静态功能未使用,

#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("%sn%sn%sn%sn%sn", HelloSloth(), SleepySloth(), HelloLlama(),
        GoodbyeSloth(), GoodbyeLlama());
    return EXIT_SUCCESS;
}
static void foo(void) {
}

Animal.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 s和更多的动作,它变得分心了。但是,我不想干扰有关foo未使用的可能警告。

MSVC(14(具有#pragma warning(push),但显然没有检查;gcc(4.2(和clang具有-Wunused-function。我已经尝试了https://gcc.gnu.org/onlinedocs/gcc/diarostic-pragmas.html,但它们似乎不起作用。有没有一种方法可以在不同的编译器上获取有关foo的所有警告,而不是关于SleepyLlama的警告?

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

在您的animals.h中添加行 -

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

这应该使编译器不抱怨未使用的功能。

迟到了几年,但是在GCC中,您也可以使用:

__attribute__((unused))

在您的功能前。抑制未使用静态功能的错误消息中的更多详细信息?

最新更新