#ifdef中的#ifdef

时间:2018-09-17 02:57:32

标签: c macros

在下面的C摘录中,仅当定义了ProductName时才执行SUPPORT_MULTI_DNS_SERVER吗?

#ifdef <ProductName>
 //do things here
#ifdef SUPPORT_MULTI_DNS_SERVER
 //do things here
#endif
 //do things here
#endif

编辑:SWE780更改为产品名称。

2 个答案:

答案 0 :(得分:3)

这就是条件包含物的工作方式。仅当第一个ifdef的值为true时,才包括嵌套在另一个ifdef中的ifdef。就您而言:

#ifdef SUPPORT_MULTI_DNS_SERVER
 //do things here
#endif
仅当#ifdef <ProductName>为true时才包含

(我假设<ProductName>为SWE780)。

来自C委员会草案(N1570):

  

6.10.1有条件包含
  ...

     
      
  1. 依次检查每个指令的条件。如果它的计算结果为假(零),则它控制的组将被跳过:伪指令仅通过确定伪指令的名称来处理,以便跟踪嵌套条件的级别;指令的其余预处理令牌将被忽略,   组。仅处理控制条件评估为true(非零)的第一组。如果没有一个条件的条件为真,并且有一个#else指令,则处理#else控制的组;缺少#else指令,将跳过直到#endif为止的所有组。
  2.   

答案 1 :(得分:2)

预处理器条件将嵌套。例如,使用:

#ifdef XYZZY
    int a;
    #ifdef PLUGH
        int b;
    #endif
    int c;
#endif

只有定义了两者 bXYZZY时,PLUGH变量才会存在。 ac变量仅取决于XYZZY

根据C11标准的6.10.1 Conditional inclusion /6部分:

  

依次检查每个指令的条件。如果评估结果为假(零),则将其控制的组跳过:仅通过确定指令的名称来对指令进行处理,以保持嵌套条件的级别。 >

此“组”是整个部分,包括所有子组。在上面给出的示例中,XYZZY组是#ifdef XYZZY和对应的#endif之间的一切