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
。
我的问题是:我有一些宏如下所示:
#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
。