C预处理器:连接另一个定义。

时间:2023-01-17 15:31:26

I'm coding for a ARM with GCC and need to concatenate (##) a name with the a definition, like this:

我正在用GCC编码一个ARM,需要将一个名称与一个定义连接起来,就像这样:

#define LCD_E_PORT GPIOC 
...
#define RCC_PORT(x) (RCC_APB2Periph_ ## (x)) // ???
...

so that afterRCC_PORT(LCD_E_PORT) I would get RCC_APB2Periph_GPIOC. It is important to say, that the LCD_E_PORT and the RCC_APB2Periph_GPIOC are NOT strings but some low-level system defined pointers (accessing them processor's memory map).

所以afterRCC_PORT(LCD_E_PORT)我将得到rcc_apb2ext - gpioc。很重要的一点是,LCD_E_PORT和rcc_apb2ext_gpioc不是字符串,而是一些低级系统定义的指针(访问它们的处理器的内存映射)。

The point of all this is to have one macro, which handles multiple port definitions.

所有这些的要点是有一个宏,它处理多个端口定义。

Is there a solution for this?

有解决办法吗?

C预处理器:连接另一个定义。
C预处理器:连接另一个定义。

I'm using arm-none-eabi-gcc.

我用arm-none-eabi-gcc。

1 个解决方案

#1


3  

The kind of thing you need required more indirection through the pre-processor:

你需要的东西需要更多的间接通过预处理器:

This (defines.c) :

这(defines.c):

#define TOKENPASTE( x, y ) x ## y
#define TOKENPASTE2( x, y ) TOKENPASTE( x, y )

#define LCD_E_PORT GPIOC
#define RCC_PORT(x)  TOKENPASTE2( RCC_APB2Periph_, x )

#define STRING(x) #x

int main( int argc, char* argv[] )
{
    RCC_PORT(LCD_E_PORT);
}

results in the expected output through gcc -E defines.c we get:

通过gcc -E定义预期输出结果。c我们得到:

# 1 "defines.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "defines.c"
# 10 "defines.c"
int main( int argc, char* argv[] )
{
    RCC_APB2Periph_GPIOC;
}

See this SO question for more information.

有关更多信息,请参见这一问题。

#1


3  

The kind of thing you need required more indirection through the pre-processor:

你需要的东西需要更多的间接通过预处理器:

This (defines.c) :

这(defines.c):

#define TOKENPASTE( x, y ) x ## y
#define TOKENPASTE2( x, y ) TOKENPASTE( x, y )

#define LCD_E_PORT GPIOC
#define RCC_PORT(x)  TOKENPASTE2( RCC_APB2Periph_, x )

#define STRING(x) #x

int main( int argc, char* argv[] )
{
    RCC_PORT(LCD_E_PORT);
}

results in the expected output through gcc -E defines.c we get:

通过gcc -E定义预期输出结果。c我们得到:

# 1 "defines.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "defines.c"
# 10 "defines.c"
int main( int argc, char* argv[] )
{
    RCC_APB2Periph_GPIOC;
}

See this SO question for more information.

有关更多信息,请参见这一问题。