是否可以模拟将#ifdef 放在另一个#ifdef #endif 中的效果?
Is it possible to simulate the effect that place #ifdef inside another #ifdef #endif?
我正在检查一些导入语句,发现一些导入语句的模式如下:
#ifdef A
#ifdef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
#else
#ifndef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
#endif
其中A的宏只是B的宏的反转,但是“//SOME SETTINGS 1”和“//SOME SETTINGS 2”需要出现两次,所以我尝试重写:
#ifdef A
#ifdef B
#else
#ifndef B
#endif
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
但是编译失败,请问有什么语法可以模拟“//SOME SETTINGS 1”和“//SOME SETTINGS 2”只需要出现一次的情况吗?
你的问题是:
#ifdef A
#ifdef B
#else
#ifndef B
#endif
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
您的#ifdef、else 和 endif 数量不正确。
完成您的要求:
#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
// settings 1
#else
// settings 2
#endif
这就是您通常处理此类问题的方式。你成立了一个卡诺真值table:
A B => 1
A !B => 2
!A B => 2
!A !B => 1
仔细阅读此 table 意味着您需要在定义(A 和 B)时或在(A 未定义且 B 未定义)时使用设置 1...因此在 C 中:
(A && B) || (!A && !B)
将其转换为 ifdef 语法即可。
您可以像这样结合定义检查。
#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
// SOME SETTINGS 1
#else
// SOME SETTINGS 2
#endif
是的,您可以使用 defined
运算符(如果定义了标识符,则计算结果为 1
,否则计算结果为 0
)。你基本上似乎想要 SOME SETTING 1
如果 A
和 B
被定义或者两者都未定义并且 SOME SETTINGS 2
否则:
#if defined(A) == defined(B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
直接比较是因为您希望 defined(A)
和 defined(B)
都为 1 或都为 0 - 而 1 和 0 是它们唯一的选择。
请注意,如果您想将其扩展到两个以上的备选方案,则必须小心使用 #elif
,因为如果您重复 #if
-[,SOME SETTINGS 1
可能会改变后续测试=24=] 组——这就是为什么我们需要对 SOME SETTINGS 2
部分使用 #else
的原因。例如:
#if COND1(A,B):
// SOME SETTINGS 1
#elif COND2(A,B):
// SOME SETTINGS 2
// etc
#else
// DEFAULT SETTINGS
#endif
当 A 和 B 已定义时,您需要设置 1,或者 A 或 B 均未定义。这应该可以解决问题:
#if (defined (A) && defined(B)) || (!defined (A) && !defined(B))
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
这个怎么样:
#if (defined A && defined B) || (!defined A && !defined B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
我正在检查一些导入语句,发现一些导入语句的模式如下:
#ifdef A
#ifdef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
#else
#ifndef B
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
#endif
其中A的宏只是B的宏的反转,但是“//SOME SETTINGS 1”和“//SOME SETTINGS 2”需要出现两次,所以我尝试重写:
#ifdef A
#ifdef B
#else
#ifndef B
#endif
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
但是编译失败,请问有什么语法可以模拟“//SOME SETTINGS 1”和“//SOME SETTINGS 2”只需要出现一次的情况吗?
你的问题是:
#ifdef A
#ifdef B
#else
#ifndef B
#endif
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
您的#ifdef、else 和 endif 数量不正确。
完成您的要求:
#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
// settings 1
#else
// settings 2
#endif
这就是您通常处理此类问题的方式。你成立了一个卡诺真值table:
A B => 1
A !B => 2
!A B => 2
!A !B => 1
仔细阅读此 table 意味着您需要在定义(A 和 B)时或在(A 未定义且 B 未定义)时使用设置 1...因此在 C 中:
(A && B) || (!A && !B)
将其转换为 ifdef 语法即可。
您可以像这样结合定义检查。
#if (defined(A) && defined(B)) || (!defined(A) && !defined(B))
// SOME SETTINGS 1
#else
// SOME SETTINGS 2
#endif
是的,您可以使用 defined
运算符(如果定义了标识符,则计算结果为 1
,否则计算结果为 0
)。你基本上似乎想要 SOME SETTING 1
如果 A
和 B
被定义或者两者都未定义并且 SOME SETTINGS 2
否则:
#if defined(A) == defined(B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
直接比较是因为您希望 defined(A)
和 defined(B)
都为 1 或都为 0 - 而 1 和 0 是它们唯一的选择。
请注意,如果您想将其扩展到两个以上的备选方案,则必须小心使用 #elif
,因为如果您重复 #if
-[,SOME SETTINGS 1
可能会改变后续测试=24=] 组——这就是为什么我们需要对 SOME SETTINGS 2
部分使用 #else
的原因。例如:
#if COND1(A,B):
// SOME SETTINGS 1
#elif COND2(A,B):
// SOME SETTINGS 2
// etc
#else
// DEFAULT SETTINGS
#endif
当 A 和 B 已定义时,您需要设置 1,或者 A 或 B 均未定义。这应该可以解决问题:
#if (defined (A) && defined(B)) || (!defined (A) && !defined(B))
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif
这个怎么样:
#if (defined A && defined B) || (!defined A && !defined B)
//SOME SETTINGS 1 (some include,define,ifdef...)
#else
//SOME SETTINGS 2 (some include,define,ifdef...)
#endif