c - 使用字符串连接的宏

标签 c string macros concatenation c-preprocessor

我想制作一个不使用参数但使用预定义整数和字符串的宏。

我之前问过一些与带有参数的宏类似的东西,它是这样的:

#define BUZZER_PIN 1
#define BUZZER_PORT B
#define BUZZER_ALT 1

#define INIT_BUZZER_(PORTX, PIN, ALT)                                   \
    do {                                                                \
        PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX(ALT) | PORT_PCR_DSE_MASK; \
        GPIO##PORTX##_PDDR |= (PIN)<<1;                                 \
       } while (0)

#define INIT_BUZZER(PORTX, PIN, ALT)                                    \
    INIT_BUZZER_(PORTX, PIN, ALT)

但是,如果我只想让 INIT_BUZZER 引用 INIT_BUZZER_ 并执行上述所有操作,该怎么办?

我尝试过:

#define INIT_BUZZER INIT_BUZZER_(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT)

我总是只有字符串有问题,而且我不太了解那部分。 如果我这样调用它,我会将 BUZZER_PORT 处理为字符串 BUZZER_PORT 而不是它的值 = B

最佳答案

在传递给 INIT_BUZZER_ 之前,您需要另一个宏来扩展宏参数。

#define INIT_BUZZER_X(PORTX, PIN, ALT)                                    \
    INIT_BUZZER_(PORTX, PIN, ALT)

#define INIT_BUZZER INIT_BUZZER_X(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT)

现在,当您在代码中使用 INIT_BUZZER 时,它将首先使用三个参数展开为 INIT_BUZZER_X。然后预处理器将继续处理 INIT_BUZZER_X,其中它将扩展三个参数中的每一个,并将它们传递给 INIT_BUZZER_

关于c - 使用字符串连接的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604476/

相关文章:

c++ - 在 C++ 中使用 std::istringsteam 将字符串转换为 float

c - 从其定义文件外部重新定义宏

c - 需要帮助理解和调整哈希表的算法

c - 带有 * 的 typedef 结构到 c 中的名称

javascript - 是否有任何字符串方法可以让我将数字字符串转换为数字和字母字符串?

c - 不兼容的指针类型传入 _Generic 宏

c++ - 在编译时识别所有调用 function1<T> 的所有 T 然后添加行 function2<T>()

c - 系统("clear");不工作,但系统 ("cls");作品

c - 使用外部 DLL 时 PL/I 中的错误处理?

string - 如何通过正则表达式 3 和 4 字节 UTF-8 进行匹配