2017-06-20 102 views
1

我想以某種方式棄用宏,即使在#if語句中使用它時也會打印出良好的警告。在#if語句中使用宏時,打印棄用警告

This answer幾乎是我想要的,但在從#if語句中訪問宏時會引發錯誤。

#include <stdio.h> 

#define DEPRECATED_CONSTANT _Pragma ("GCC warning \"Deprecated constant!\"") 0 
#define DEPRECATED_FUNCTION(...) _Pragma ("GCC warning \"Deprecated function!\"") printf(__VA_ARGS__) 

int main() { 
    // Prints a warning (good) 
    int n = DEPRECATED_CONSTANT; 

    // Prints a warning (good) 
    DEPRECATED_FUNCTION("%d\n", n); 

// Throws an error (bad) 
#if DEPRECATED_CONSTANT 
    return 1; 
#else 
    return 2; 
#endif 
} 

的錯誤是:

error: missing binary operator before token "(" 

獎勵積分,如果你能找到我一個跨平臺兼容的解決方案!

編輯

我試圖妥善處理庫中的一個重大更改 - 我希望用戶有一個很好的,明確的警告(或錯誤)時,他們使用舊的宏,所以這將是清楚他們需要將他們的代碼遷移到使用新的宏。這些編譯指示解決方案只有在代碼中使用該常量的值時纔有效,而不是在預處理器指令中訪問該值時使用。

根據下面提供的答案,似乎沒有解決這個問題的方法(除了可能使用clang時?)。感謝大家。

+0

您可以添加上下文。你想通過編寫'#if DEPRECATED_CONSTANT'來測試什麼?你想測試宏是否定義? – Stargateur

+0

我想打印一個棄用警告,只要以任何方式使用宏。 –

+0

我假設你的用例阻止你使用'#ifdef'? – DIMMSum

回答

4

我想拋棄一個宏,即使它在#if語句中使用,也會打印出好的 警告。

我打算建議逗號運算符,但這似乎不起作用,因爲_Pragma宏可能不會產生真正的代碼。此外,海灣合作委員會,至少,明確地說你不能做你_Pragma()提出的:

https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html

標準是其中_Pragma操作者可出現不明。 預處理程序不會在預處理條件 指令(如「#if」)中接受它。爲了安全起見,您可能最好將 以外的指令放在「#define」之外,並將其放在 自己的一行上。

PS - 鐺8.1.0沒有錯誤的程序,給你想要的警告......

1

正如@ jschultz410提到,你正在做什麼的gcc明確禁止(見https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html)。

嵌套宏這樣的用例似乎是適當的:

#include <stdio.h> 

#define DEPRECATED_CONSTANT_VALUE 0 
#define DEPRECATED_CONSTANT _Pragma ("GCC warning \"Deprecated constant!\"") DEPRECATED_CONSTANT_VALUE 
#define DEPRECATED_FUNCTION(...) _Pragma ("GCC warning \"Deprecated function!\"") printf(__VA_ARGS__) 

int main() { 
    // Prints a warning (good) 
    int n = DEPRECATED_CONSTANT; 

    // Prints a warning (good) 
    DEPRECATED_FUNCTION("%d\n", n); 

// Throws an error (bad) 
#if DEPRECATED_CONSTANT_VALUE 
    return 1; 
#else 
    return 2; 
#endif 
} 

是的,這是一種嚴重的,但在我們的任何一種典雅高貴的設計已經放棄預處理器邏輯的土地第一名。至少這種方式宏接口保持在非預處理器代碼中。 (是的,這不會打印#if聲明中的預處理器警告,但不幸的是,這對於gcc是不可能的)。