c - 将 #endif 放入 #if 内

标签 c c-preprocessor

是否可以将 #endif 放在 #if 内作为 block 的“内容”,而不是作为 #if 的 #endif 对?

#if (SOME_CONDITION)
    #if (ANOTHER_CONDITION)
#endif // pair endif for #if (SOME_CONDITION)


#if (SOME_CONDITION)
    #endif // pair endif for #if (ANOTHER_CONDITION)
#endif // pair endif for #if (SOME_CONDITION)

如果这不可能,如何有条件地编译 #if ... #endif 对?

这就是我正在做的事情。

我正在修改从另一家公司购买的代码库。为了轻松地在进行修改和不进行修改的情况下编译它,我使用了如下所示的宏。

#if (MY_COMPANY_EDITS_ENABLED)
// My Modified code goes here
#else
// unmodified code from another company
#endif

通过这种方式,我可以轻松地编译输入/输出我的修改,同时保持我的编辑的可读性。我到处都使用相同的 #if#else #endif block 。但后来我遇到了一个正在编译的代码,在原始的未修改的代码库中,基于一些宏值。

#if (FEATURE_A_IS_ENABLED)
// Line 1
// Line 2
#endif

但我想编译此代码[第 1 行和第 2 行],无论宏值 FEATURE_A_IS_ENABLED 是什么

我的第一个想法是遵循我迄今为止使用的相同约定[以保持我的编辑的可读性]。

#if (MY_COMPANY_EDITS_ENABLED)
//#if (FEATURE_A_IS_ENABLED)
#else
#if (FEATURE_A_IS_ENABLED)
#endif

// Line 1
// Line 2

#if (MY_COMPANY_EDITS_ENABLED)
// #endif
#else
#endif
#endif

然后我意识到这是不可能的。

我知道,存在替代方法可以实现相同的目的。但想知道我是否可以使用相同的约定

#if (MY_COMPANY_EDITS_ENABLED)
// My Modified code goes here
#else
// unmodified code from another company
#endif

在这种情况下也是如此。

最佳答案

不,这是不可能的。第一个 #endif 将与最近的 #if#else 匹配,因此您的代码将被解释为如下:

#if (SOME_CONDITION)
    #if (ANOTHER_CONDITION)
    #endif // pair endif for #if (ANOTHER_CONDITION)


    #if (SOME_CONDITION)
    #endif // pair endif for the second #if (SOME_CONDITION)
#endif // pair endif for the first #if (SOME_CONDITION)

关于c - 将 #endif 放入 #if 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512370/

相关文章:

c++ - 如何获得 winMain hInstance? Windows 32 编程

c++ - 枚举多个文件,或多个文件的自动唯一常量

c++ - 如果数据已经发送,为什么 select 只将文件描述符显示为就绪?

c - 我该如何处理 SIGCHLD?

c++ - 在 CodeRunner 中编译 C++/C 代码时出现 Clang 错误

c - 为什么预处理器条件给我这个输出

c++ - GCC 的 _Pragma 运算符中的预处理器标记粘贴

c++ - 如果你只有一个标识符,#define 会做什么

c - 是否可以防止 C 中宏的重复、相同参数?

c - Windows下如何获取ip地址