【发布时间】:2026-02-16 18:40:01
【问题描述】:
如何创建 C 宏来获取字符串的整数值?具体用例来自问题here。我想像这样更改代码:
enum insn {
sysenter = (uint64_t)'r' << 56 | (uint64_t)'e' << 48 |
(uint64_t)'t' << 40 | (uint64_t)'n' << 32 |
(uint64_t)'e' << 24 | (uint64_t)'s' << 16 |
(uint64_t)'y' << 8 | (uint64_t)'s',
mov = (uint64_t)'v' << 16 | (uint64_t)'o' << 8 |
(uint64_t)'m'
};
到这里:
enum insn {
sysenter = INSN_TO_ENUM("sysenter"),
mov = INSN_TO_ENUM("mov")
};
INSN_TO_ENUM 扩展为相同的代码。性能是一样的,但可读性会大大提高。
我怀疑这种形式可能是不可能的,因为 C 预处理器无法处理字符串,所以这也是一个不受欢迎但可以接受的解决方案(变量参数宏):
enum insn {
sysenter = INSN_TO_ENUM('s','y','s','e','n','t','e','r'),
mov = INSN_TO_ENUM('m','o','v')
};
【问题讨论】:
-
此时我将编写自己的预处理器。试图按照自己的方式去做只会让人感到非常痛苦。这是一个用您最喜欢的脚本语言编写的简单脚本。假设您的枚举随着时间的推移是相对静态的(即您不是日复一日地编辑它们),那么我认为这将是方便和可读的。
-
@DavidHeffernan:我考虑过这一点,但作为最后的手段。如果它可以作为一个宏来完成,我们就具有可读性的优势,并且能够抽象/隐藏这个特定的实现细节。 IMO 的优势超过了通过“预处理”生成的选项。
-
我不确定宏是否可以处理变量参数,或者它只是接受它来传递它。请参阅我对第一个论点的回答。
-
@Mike Kwan:这是一种使用枚举的奇怪方式。也许你应该只做
enum insn { sysenter, mov };并对顺序编号感到满意。你想解决什么问题? -
@DavidGrayson:我要解决的问题是这个:*.com/questions/9524342/…
标签: c macros c-preprocessor