我想创建一个C宏,它创建一个名称基于行号的函数.我以为我可以做类似的事情(真正的函数会在括号内有声明):
#define UNIQUE static void Unique_##__LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
我希望将扩展到以下内容:
static void Unique_23(void) {}
Run Code Online (Sandbox Code Playgroud)
这不起作用.使用令牌连接,定位宏按字面处理,最终扩展为:
static void Unique___LINE__(void) {}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
(是的,无论这看起来多么无用,我都有一个真正的理由要这样做).
我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.
我想连接两个标记,但第二个标记应该首先扩展.
#define ANSWER 42
#define FOO foo_ ## ANSWER
Run Code Online (Sandbox Code Playgroud)
在这里,FOO扩展到foo_ANSWER,但我希望它foo_42.所以我定义了一个MERGE宏,希望在连接之前以某种方式扩展参数:
#define MERGE(x, y) x ## y
#define BAR MERGE(bar_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
但BAR仍然扩大到bar_ANSWER而不是bar_42.所以我定义了另一个宏HELPER:
#define HELPER(x, y) MERGE(x, y)
#define BAZ HELPER(baz_, ANSWER)
Run Code Online (Sandbox Code Playgroud)
现在BAZ已成功扩展到baz_42.目前,这对我来说似乎很神奇.
任何人都可以向我解释这种行为吗?扩展规则如何正常工作?
我正在尝试为PIC微控制器开发通用UART模块.我要做的是定义正在使用的UART,然后让预处理器自动将其替换为其他宏(寄存器名称).
就像是:
#define UART 5
#define UART_RXREG U ## UART ## RXREG
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它扩展到UUARTRXREG而不是U5RXREG.
有没有办法做到这一点,还是根本不可能?
请注意,我不是在寻找简单的字符串连接.我需要先扩展UART宏.
可能重复:
用于在C中连接两个字符串的宏
如何用宏连接两个字符串?
我试过这个,但它没有给出正确的结果:
#define CONCAT(string) "start"##string##"end"
Run Code Online (Sandbox Code Playgroud) 可能重复:
用于在C中连接两个字符串的宏
我有一个看起来像这样的函数:
bool module_foo_process(void* bar) { return doMagic(bar); }
Run Code Online (Sandbox Code Playgroud)
现在,我想用宏生成它.例如,上述函数的宏看起来像这样:
MY_AMAZING_MACRO(foo)
Run Code Online (Sandbox Code Playgroud)
这允许我写下这样的东西:
MY_AMAZING_MACRO(awesome)
Run Code Online (Sandbox Code Playgroud)
得到这个:
bool module_awesome_process(void* bar) { return doMagic(bar); }
Run Code Online (Sandbox Code Playgroud)
关于如何在C中实现这一点的任何想法?