是否有可能为一个特定的参数值以不同的方式扩展一个宏,对所有其他参数的扩展方式不同?
假设我定义了一个当前用户:
#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)