相关疑难解决方法(0)

基于参数的C预处理器宏专业化

是否有可能为一个特定的参数值以不同的方式扩展一个宏,对所有其他参数的扩展方式不同?

假设我定义了一个当前用户:

#define CURRENT_USER john_smith
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是拥有一个宏,如果用户通过匹配,将以不同方式展开CURRENT_USER.请注意,我不知道所有可能的用户先验.最基本的案例:

#define IS_CURRENT_USER(user)                   \
    /* this is not valid preprocessor macro */  \
    #if user == CURRENT_USER                    \
        1                                       \
    #else                                       \
        0                                       \
    #endif                                      
Run Code Online (Sandbox Code Playgroud)

像宏一样,依赖于用户名的每个其他宏都可以按照以下方式完成:

#define SOME_USER_SPECIFIC_MACRO(user) SOME_USER_SPECIFIC_MACRO_SWITCH_1(IS_CURRENT_USER(user))

#define SOME_USER_SPECIFIC_MACRO_SWITCH_1(switch)   SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) // expand switch ...
#define SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch)   SOME_USER_SPECIFIC_MACRO_##switch         // ... and select specific case

#define SOME_USER_SPECIFIC_MACRO_0  ... // not current user
#define SOME_USER_SPECIFIC_MACRO_1  ... // current user
Run Code Online (Sandbox Code Playgroud)

这可能吗?

编辑:让我澄清一下.假设每个程序员CURRENT_USER在其配置头中定义了不同的.当且仅当他们的user参数匹配时,我希望用户特定的宏扩展到有意义的东西CURRENT_USER.因为我希望那些宏包含_pragmas,它不能进行运行时检查(如下面的一些anwsers中所提出的).

编辑:再次,澄清.假设有宏来禁用某些代码段的优化:

#define TURN_OPTIMISATION_OFF __pragma …
Run Code Online (Sandbox Code Playgroud)

c c++ c-preprocessor

15
推荐指数
2
解决办法
1万
查看次数

标签 统计

c ×1

c++ ×1

c-preprocessor ×1