是否可以使用C预处理器检查已定义语句的值?

时间:2016-11-14 12:14:28

标签: c-preprocessor

我们说我有一个#define RTR r2声明。是否可以检查RTR宏的?我看起来像这样:

#if RTR == r1 || RTR == r2
It is router1 or router2!
#endif

我想这是不可能的..

1 个答案:

答案 0 :(得分:1)

让我们看看GCC documentation

  

[在' #if'] 表达式是整数类型的C表达式,受到严格的限制。它可能包含

     
      
  • [...]
  •   
  • 宏。在表达式值的实际计算开始之前,表达式中的所有宏都会被扩展。   定义运算符的使用,它允许您检查是否在'#if'中间定义了宏。
  •   
  • 不是宏的标识符,它们都被认为是数字零。这允许您编写#if MACRO而不是#ifdef MACRO,如果您知道MACRO在定义时将始终具有非零值。没有函数调用括号的函数式宏也被视为零。
  •   

所以,根据最后一点,除非r1 ans r2是你的例子中的宏(或整数常量),条件

#if RTR == r1 || RTR == r2

相当于

#if RTR == 0 || RTR == 0

我猜这不是所希望的行为。为此,您应该为RTR分配一个整数常量值(或表达式,在编译时计算整数常量)。

顺便说一下,在给预处理器宏这样一个短名称RTR时,你应该非常小心,因为它很容易与某些东西发生冲突。