【发布时间】:2012-07-22 20:25:25
【问题描述】:
是否可以让一个宏对一个特定的参数值进行不同的扩展,而对所有其他参数进行不同的扩展?
假设我定义了一个当前用户:
#define CURRENT_USER john_smith
我想要做的是有一个宏,如果用户传递匹配 CURRENT_USER,它将以不同的方式扩展。请注意,我事先并不知道所有可能的用户。最基本的案例:
#define IS_CURRENT_USER(user) \
/* this is not valid preprocessor macro */ \
#if user == CURRENT_USER \
1 \
#else \
0 \
#endif
使用这样的宏,依赖用户名的所有其他宏都可以通过以下方式完成:
#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
这可能吗?
编辑:让我澄清一下。假设每个程序员在他们的配置头中定义了不同的CURRENT_USER。当且仅当其user 参数与CURRENT_USER 匹配时,我希望用户特定的宏扩展为有意义的东西。因为我希望这些宏包含_pragmas,所以它不能进行运行时检查(如下面的一些回答者所建议的)。
编辑:再次澄清。假设有一个宏可以禁用某些代码段的优化:
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
一些程序员希望关闭不同代码段的优化,但不是一次全部关闭。我想要的是有一个宏:
#define TURN_OPTIMISATION_OFF(user) /* magic */
这将匹配 user 参数与 CURRENT_USER 宏,取自每个程序员的配置文件。如果用户匹配宏则扩展为 pragma。如果没有,那就什么都没有。
【问题讨论】:
-
user参数从何而来?预处理的复杂器是常数吗?为什么_Pragma要求排除了“运行时”检查(一个好的优化编译器会在编译时优化!)。你真的应该说更多,显示更多代码,并解释更多。您还应该查看预处理输出以了解预处理器的作用。 -
您是否考虑过改进您的构建机制(例如您的
Makefile-s),以便使用例如调用编译器-DCURRENT_USER_ID=$(shell id -u),假设是带有 GNU 的 Linux 系统make)? -
感谢您的建议,但在这种情况下,我们定义
CURRENT_USER的位置无关紧要。 -
您确实应该解释潜在的预处理器技巧的总体目标。它是开发人员特定的优化(我认为这是一个错误)吗?如果是,请说明并告诉我们您的开发系统。
-
@BasileStarynkevitch:我试图让这个问题尽可能抽象。我欢迎您的意见,但将放弃讨论——我没有征求一般性建议。我非常具体地询问了 C 预处理器机制。
标签: c++ c c-preprocessor