【问题标题】:Declare a variable and add it to an array at compile time声明一个变量并在编译时将其添加到数组中
【发布时间】:2020-04-01 16:03:18
【问题描述】:

我想要一个(或多个)C 宏,它可以用于两个目的:

  • 声明一个常量变量。
  • 将该变量添加到数组中。

即,如果我有这个

typedef struct {
  int port;
  int pin;
} pin_t; 

这样的宏

#define DEFINE_PIN(name, port, num)   

应该扩展成这样的东西

#define NAME port, num
const pin_t[] = {
    {NAME}
};

并且每个定义都应该将新定义的变量附加到数组中。

我知道#define 不能扩展到#defines,而只是一个说明。我想要完成的是,一方面,定义必要时使用的引脚,另一方面,有一种简单的方法来遍历所有引脚,即配置硬件 gpios。

【问题讨论】:

  • 如果您使用gccgcc -E <file.c> 是测试宏扩展的好方法,因为它只运行文件<file.c> 上的预处理器步骤。请注意,包含也会被扩展,因此您可能会暂时删除它们。
  • 我可以向this question 提出我的答案的变体。如果您需要,我可以根据您的情况定制该解决方案,但可能没有必要。优点:与下面的答案相比,它不需要 position 字段。并且人口是在初始化时完成的。缺点:有人可能觉得它不优雅。但它目前用于大型项目。
  • 如果你有一个聪明的编译器,你可以做一些看起来很愚蠢的事情:只需创建一个大的const 引脚数组,每个条目都有一个字符串成员给出它的名称,然后编写一个函数,给定一个字符串,搜索数组并返回具有该名称的引脚。如果您启用内联并使用字符串文字调用搜索函数,那么像 gcc 这样的优秀编译器会优化整个事情并将其减少到适当的常量。 Example.

标签: c macros c-preprocessor


【解决方案1】:

下面是包含定义的头文件,以便它们可以在其他编译单元中使用:

#include <stdio.h>

#ifndef header_constant
#define header_constant

typedef struct {
  int port;
  int pin;
} pin_t;

pin_t pinArray[100];

#define DEFINE_PIN(name, port, num,arrayPos) \
  const pin_t name = {port, num};\
  pinArray[arrayPos]= name;


#endif

注意:\ 字符告诉编译器继续使用下一行作为宏的一部分。

下面是主程序:

# include "headername.h"

void main(){
  DEFINE_PIN(pin1,1,2,0);
  DEFINE_PIN(pin2,3,4,1);
  DEFINE_PIN(pin3,6,5,2);
  printf("%d",pin2.pin);
}

【讨论】:

  • 注意:\ 字符告诉编译器继续使用下一行作为宏的一部分
  • @perencia 编辑了答案。上面的代码在 gcc 上编译。你能详细说明问题吗?
  • 我希望能够在其他源文件中引用 const 变量和数组。使用您的代码,所有代码都是使用定义的方法的本地代码。
  • 我建议进行编辑。当 cmets 中显示新需求时,不要写 edit:;只需将其包含在您的答案中即可。请记住,可以在一定时间后删除 cmets,并且您的答案可能对其他用户也有用,而不仅仅是 OP。 ;)
  • @perencia 如果您创建一个文本文件来读取和写入数组元素,它会起作用吗?另外,我不确定,但也许你可以以某种方式使用extern 来共享变量
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2015-05-27
  • 2012-05-16
相关资源
最近更新 更多