在下面的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更改为产品名称。
答案 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有条件包含
...
- 依次检查每个指令的条件。如果它的计算结果为假(零),则它控制的组将被跳过:伪指令仅通过确定伪指令的名称来处理,以便跟踪嵌套条件的级别;指令的其余预处理令牌将被忽略, 组。仅处理控制条件评估为true(非零)的第一组。如果没有一个条件的条件为真,并且有一个
#else
指令,则处理#else
控制的组;缺少#else指令,将跳过直到#endif
为止的所有组。
答案 1 :(得分:2)
预处理器条件将嵌套。例如,使用:
#ifdef XYZZY
int a;
#ifdef PLUGH
int b;
#endif
int c;
#endif
只有定义了两者 b
和XYZZY
时,PLUGH
变量才会存在。 a
和c
变量仅取决于XYZZY
。
根据C11标准的6.10.1 Conditional inclusion /6
部分:
依次检查每个指令的条件。如果评估结果为假(零),则将其控制的组跳过:仅通过确定指令的名称来对指令进行处理,以保持嵌套条件的级别。 >
此“组”是整个部分,包括所有子组。在上面给出的示例中,XYZZY
组是#ifdef XYZZY
和对应的#endif
之间的一切。