2017-06-20 103 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是不可能的)。