C 预处理器宏:基于单个方差压缩代码

C preprocessor macros: compacting code based on a single variance

我的问题是:我有一些宏如下所示:

#define _EI_PORTLETTER 'D'
...code...
#if _EI_PORTLETTER == 'C'
#define _EI_VECTOR PORTC_VECT
if _EI_PORTLETTER == 'D'
#define _EI_VECTOR PORTD_VECT
#endif

然后在我的代码中我有:

ISR(_EI_VECTOR, ISR_NAKED) {
...code...
}

我希望能够做的是定义 _EI_PORTLETTER 而不必因为单个字母的变化而重写我的宏(因为它们有 6 个主体,而且我有更多_EI_PORTLETTERS 而不仅仅是 'C' 和 'D')。可能吗?也就是说,像这样:

#define _EI_PORTLETTER 'D'
...code...

#define _EI_VECTOR PORT _EI_PORTLETTER _VECT

#define _EI_VECTOR(x) PORT x _VECT

使得 _EI_VECTOR 或 _EI_VECTOR_(x) 解析为:

PORTD_VECT

(D 周围没有任何间距)。

这可以使用 C 宏吗?

我觉得很简单,但我做不到。是的,我搜索了 Google 和 Stack Overflow,阅读了 GCC 文档。我一直无法弄清楚如何做我想做的事,甚至不知道是否可行。

是的,这是可能的:

#define EI_PORTLETTER D
#define EI_VECTOR_(x) PORT ##x ##_VECT
#define EI_VECTOR2_(x) EI_VECTOR_(x)
#define EI_VECTOR EI_VECTOR2_(EI_PORTLETTER)

EI_VECTOR_ 宏使用标记粘贴运算符 ## 来构建所需的标识符。

EI_VECTOR2_ 宏用于间接 EI_PORTLETTER,以便将其扩展为 D 而不是仅仅粘贴为 EI_PORTLETTER