相关疑难解决方法(0)

使用##和__LINE__创建C宏(使用定位宏进行标记连接)

我想创建一个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)

这可能吗?

(是的,无论这看起来多么无用,我都有一个真正的理由要这样做).

c macros concatenation token

103
推荐指数
1
解决办法
6万
查看次数

预处理程序令牌扩展

我对预处理器如何工作的心理模型显然是不完整的,这让我发疯.

我想连接两个标记,但第二个标记应该首先扩展.

#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.目前,这对我来说似乎很神奇.

任何人都可以向我解释这种行为吗?扩展规则如何正常工作?

c c++ c-preprocessor

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

C预处理器宏替换

我正在尝试为PIC微控制器开发通用UART模块.我要做的是定义正在使用的UART,然后让预处理器自动将其替换为其他宏(寄存器名称).

就像是:

#define UART        5
#define UART_RXREG  U ## UART ## RXREG
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它扩展到UUARTRXREG而不是U5RXREG.

有没有办法做到这一点,还是根本不可能?

请注意,我不是在寻找简单的字符串连接.我需要先扩展UART宏.

c

5
推荐指数
1
解决办法
837
查看次数

字符串与宏连接

可能重复:
用于在C中连接两个字符串的宏

如何用宏连接两个字符串?

我试过这个,但它没有给出正确的结果:

#define CONCAT(string) "start"##string##"end"
Run Code Online (Sandbox Code Playgroud)

c macros

4
推荐指数
1
解决办法
7044
查看次数

使用宏来构造函数

可能重复:
用于在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中实现这一点的任何想法?

c macros c-preprocessor

0
推荐指数
1
解决办法
149
查看次数

标签 统计

c ×5

macros ×3

c-preprocessor ×2

c++ ×1

concatenation ×1

token ×1