C 构建#define指令数组

C 构建#define指令数组,c,arrays,c-preprocessor,C,Arrays,C Preprocessor,我有一些微控制器代码,使用一些头文件,其中GPIO引脚定义如下: #define PA3 GPIO(GPIO_PORTA, 3) 使用IDE,我可以导航到GPIO的实现,我发现: #define GPIO(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu)) 而端口是一个枚举定义为: const uint8_t pin enum gpio_port { GPIO_PORTA, GPIO_PORTB, GPIO_POR

我有一些微控制器代码,使用一些头文件,其中GPIO引脚定义如下:

#define PA3 GPIO(GPIO_PORTA, 3)
使用IDE,我可以导航到
GPIO
的实现,我发现:

#define GPIO(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))
端口
是一个
枚举
定义为:

const uint8_t pin
enum gpio_port { GPIO_PORTA, GPIO_PORTB, GPIO_PORTC, GPIO_PORTD, GPIO_PORTE }
我想创建一个包含所有GPIO定义(
PA3
PA4
等)的数组,该数组可以通过串行端口传递的整数进行索引

我尝试了以下方法:

GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
但这显然不起作用,因为GPIO不是公认的C类型,而是一个宏。尝试生成时,我收到以下错误消息:

unknown type name 'GPIO'
我甚至可以声明一个宏数组吗?如果是这样,我将如何记录我正在使用的类型

谢谢。

#define
语句执行文本替换,它们没有固有的类型。正如您所指出的,
GPIO
不是有效类型,它是一个用于计算pin码/地址的宏(实际上
GPIO
是未定义的,而
GPIO(a,b)
是宏)

如果您想存储其中许多元素的数组,那么您需要知道它们的实际计算类型。假定
GPIO
宏返回一个
port
和一个
pin
值的总和,其中
port
是一个枚举,其底层类型是
int
(技术上,它是一个特定于实现的整数类型-请参见),而
pin
是一个
uint8\t
,数组值的实际类型也是整数类型-具体取决于您的实现和可能值的范围。

\define
语句执行文本替换,它们没有固有的类型。正如您所指出的,
GPIO
不是有效类型,它是一个用于计算pin码/地址的宏(实际上
GPIO
是未定义的,而
GPIO(a,b)
是宏)


如果您想存储其中许多元素的数组,那么您需要知道它们的实际计算类型。假定
GPIO
宏返回一个
port
和一个
pin
值的总和,其中
port
是一个枚举,其底层类型是
int
(技术上,它是一个特定于实现的整数类型-请参见),而
pin
是一个
uint8\t
,数组值的实际类型也是整数类型-具体取决于您的实现和可能值的范围。

不,您不能创建这样的宏数组

如果要基于输入执行特定宏,则需要使用
If-else
switch
语句。如果输入为整数,则可以执行以下操作:

switch( input )
{
  case 0: PA3; break;
  case 1: PA4; break;
  case 2: PA21; break;
  ...
 }

不,不能创建这样的宏数组

如果要基于输入执行特定宏,则需要使用
If-else
switch
语句。如果输入为整数,则可以执行以下操作:

switch( input )
{
  case 0: PA3; break;
  case 1: PA4; break;
  case 2: PA21; break;
  ...
 }

你发布的数组是完全合法的,我想你还没有测试过它。无论如何,最好用一个可测试的示例提问,(请参阅),但代码:

GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
将生成一个完全合法初始化的整数数组,其中包含从宏展开的常量的按位值。尝试使用

cpp source.c | more
查看数组声明实际上是如何展开的。顺便说一下,您的代码中还有另一个不同的问题。。。您正在使用相同的标识符
GPIO
,来指示
GPIO
宏名称和数组元素的类型,因此当宏处理器遇到它时,它看不到任何参数,这不是您定义它的方式,还有关于调用完全没有参数的双参数宏
GPIO
的投诉

你必须测试你的代码。。。并发送1。你所期待的。。。二,。你得到的是。。。因为如果你只是停下来阅读,错误应该是显而易见的

解决问题的方法是将宏
GPIO
重命名为
GPIO\u位
,例如。。。然后更改所有定义:

#define GPIO_BITS(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))

...

#define PA3 GPIO_BITS(GPIO_PORTA, 3)

#定义GPIO_位(端口、pin)(((端口)和0x7u)您发布的阵列是完全合法的,我认为您尚未对其进行测试。无论如何,最好用一个可测试的示例询问(请参阅),但代码:

GPIO knavePinList[] = {PA3, PA4, PA21, PB4, PHY_RESET_PIN, PD0, PD1, PD2, PD3, PD4, PD5, PD6, PD7, PD8, PD9};
将生成一个完全合法初始化的整数数组,其中包含从宏展开的常量的按位值

cpp source.c | more
查看数组声明实际上是如何展开的。顺便说一句,代码中还有另一个不同的问题……您正在使用相同的标识符
GPIO
,来指示
GPIO
宏名称和数组元素的类型,因此当宏处理器遇到它时,它看不到参数,而我这不是您定义它的方式,也不是您抱怨调用一个没有任何参数的双参数宏
GPIO

你必须测试你的代码…并发送1.你期望的…和2.你得到的…因为错误应该是明显的,如果你只是停下来阅读它

解决此问题的方法是将宏
GPIO
重命名为
GPIO\u位
,然后更改所有定义:

#define GPIO_BITS(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))

...

#define PA3 GPIO_BITS(GPIO_PORTA, 3)

#定义GPIO_位(端口,引脚)(((端口)和0x7u)感谢您的响应,我的新解决方案是创建两个数组-一个类型为
enum GPIO_port
,一个类型为
uint8_t
,然后调用
GPIO(a,b)
宏我自己在代码中。我编辑了这个问题以反映我真正想要做的事情-即创建一个宏数组,而不是一个定义指令数组。感谢您的回答,我的新解决方案是创建两个数组-一个类型为
枚举gpio\U端口
,另一个类型为
uint8\U t
,然后调用
GPIO(a,b)
ma