2017-05-08 94 views
0

的部分在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到被一個聰明的編譯器檢測爲未使用並且被代碼優化。我不想聽到它;潛在地,當我擴展到更多的行動時,它變得分散注意力。但是,我不想幹涉foo未被使用的可能警告。

MSVC(14)有#pragma warning(push),但顯然不檢查; gcc(4.2)和clang-Wunused-function。我試過https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html,但它們似乎不適用於功能。有沒有辦法在不同的編譯器中獲得關於foo的所有警告,而不是關於SleepyLlama的警告?

+0

爲什麼要這些「模板」。你可以很容易地使用一個簡單的函數來完成這項工作.... – LPs

+0

gcc中的'Wno-unused-function'('-Wunused-function'意思是把它打開)。或者你可以在標題中使用不同的技術來實現靜態功能 –

+4

爲什麼簡單如果可以使它變得複雜?這是一些混淆課嗎?認真:不要太看中宏!不僅代碼不易讀,而且調試也很難。集中精力編寫可讀代碼!並刪除不相關的標籤。 C和C++是不同的語言! – Olaf

回答

2

不是禁用警告的方法,但可以通過實際使用它們來禁止未使用的警告。

在你animals.h添加行 -

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

這應該使編譯器不抱怨不使用的功能。

+0

優雅。打開所有的錯誤,這在GCC4.2.1 -O3,clang1.7(我必須有兩個'DummyWrappers'互相調用來擺脫''-Wunsed-function',MSVC14/O2(/ Ox didn' t去掉二進制中的函數),BCC32C10.1(7.20 ?,)和MinGW GCC4.9.3 -O3。 –

+0

我曾懷疑有些編譯器會意識到使用單個函數實際上並沒有調用它,並且需要這兩個函數。原則上即使有兩個函數,編譯器也可以發現它是沒有入口點的循環。在這種情況下,你可以聲明一個函數指針併爲其指定一個虛擬包裝器。由於可以調用函數指針(可能來自其他翻譯單元),因此問題將得到解決。 –