为一段代码屏蔽未使用的静态函数警告
Silencing Unused Static Function Warnings for a Section of Code
本着What are the consequences of ignoring: warning: unused parameter的精神,但我有未使用的静态函数,
#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) {
}
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
和更多操作时,它会变得分散注意力。但是,我不想干扰有关 foo
未使用的可能警告。
MSVC
(14) 有 #pragma warning(push)
,但显然不检查; gcc
(4.2) 和 clang
有 -Wunused-function
。我试过 https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html 但它们似乎不适用于函数。有没有办法在不同的编译器中获取关于 foo
而不是关于 SleepyLlama
的所有警告?
不是禁用警告的方法,但您可以通过实际使用它们来抑制未使用的警告。
在您的 animals.h
中添加行 -
static const char *A_(DummyWrapper)(void) {
(void)A_(Hello)();
(void)A_(Goodbye)();
(void)A_(Sleepy)();
(void)A_(DummyWrapper)();
}
这应该使编译器不会抱怨未使用的函数。
本着What are the consequences of ignoring: warning: unused parameter的精神,但我有未使用的静态函数,
#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) {
}
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
和更多操作时,它会变得分散注意力。但是,我不想干扰有关 foo
未使用的可能警告。
MSVC
(14) 有 #pragma warning(push)
,但显然不检查; gcc
(4.2) 和 clang
有 -Wunused-function
。我试过 https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html 但它们似乎不适用于函数。有没有办法在不同的编译器中获取关于 foo
而不是关于 SleepyLlama
的所有警告?
不是禁用警告的方法,但您可以通过实际使用它们来抑制未使用的警告。
在您的 animals.h
中添加行 -
static const char *A_(DummyWrapper)(void) {
(void)A_(Hello)();
(void)A_(Goodbye)();
(void)A_(Sleepy)();
(void)A_(DummyWrapper)();
}
这应该使编译器不会抱怨未使用的函数。