Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;arduino配置字段的宏_C++_Arduino_Macros - Fatal编程技术网

C++ C++;arduino配置字段的宏

C++ C++;arduino配置字段的宏,c++,arduino,macros,C++,Arduino,Macros,TL;DR:我想要一些语法糖,使代码更短更漂亮。 Pelude: 我正在为Arduino编写一个库,它应该有助于将配置存储在EEPROM(独立于电源的闪存)中 要使用它,用户应执行以下操作: #包括“myEeprom.h” //实例化全局配置对象 myeeprom配置; //定义常量以便于使用,值是配置字段的索引 const int CONF_BTN_ACTIVE=0; const int CONF_DEFAULT_LEVEL=1; const int CONF_USER_NAME=2; //函

TL;DR:我想要一些语法糖,使代码更短更漂亮。

Pelude:

我正在为Arduino编写一个库,它应该有助于将配置存储在EEPROM(独立于电源的闪存)中

要使用它,用户应执行以下操作:

#包括“myEeprom.h”
//实例化全局配置对象
myeeprom配置;
//定义常量以便于使用,值是配置字段的索引
const int CONF_BTN_ACTIVE=0;
const int CONF_DEFAULT_LEVEL=1;
const int CONF_USER_NAME=2;
//函数,该函数定义要存储的配置字段的配置
//它应该在setup()函数内部调用
void init_config_字段()
{
//设置第一个字段(请参见如何将常量用作索引)
//每个字段都是一个结构{int-type,char*name,int-bytes\u-size}
配置字段[CONF_BTN_ACTIVE]={
myeeprom::TYPE_BOOL,
“配置已激活”,
1.
};
//下一个
配置字段[CONF_DEFAULT_LEVEL]={
myeeprom::TYPE_INT,
“配置已激活”,
4.
};
//下一个
配置字段[CONF_USER_NAME]={
myeeprom::TYPE_STR,
“配置用户名称”,
16//size(字节)实际上仅在type为type_STR时使用
}
//让myeeprom知道它存储了多少字段。
config.fields\u count=3;
//让myeeprom计算配置字段的所有地址,
//阅读它的价值观,做其他有用的事情。
config.init();
}
...
//代码中的某个地方:
//读取数据:
bool处于活动状态;
读取(CONF\u BTN\u活动,is\u BTN\u活动);
//写入数据
config.write(CONF_DEFAULT_LEVEL,175);
//通过字符串键读取数据(例如,我们从串口获取数据):
读取(“CONF_BTN_ACTIVE”、&is_BTN_ACTIVE);
//显示带有调试功能的所有配置到串行:
对于(int i=0;i
现在,问题来了

我想要一个宏,可以解决以下任务:

  • 请允许我只写一次“CONF_BTN_ACTIVE”这样的字符串,而不是重复whem。它们被两次使用,第一次作为常量,以便于编写程序,第二次用于运行时调试。但如果有很多这样的字段,代码就会变得难看:(

  • 允许我不写入全部字段(如config.fields\u count=3)

  • 所以,代码看起来像:

    #包括“myEeprom.h”
    //实例化全局配置对象
    myeeprom配置;
    //函数,该函数定义要存储的配置字段的配置
    //它应该在setup()函数内部调用
    void init_config_字段()
    {
    //使用宏创建配置字段和常量
    添加\u config\u magic\u宏(config,CONF\u BTN\u ACTIVE,myeeprom::TYPE\u BOOL,1)
    //下一个
    添加\u config\u magic\u宏(配置,配置默认级,myeeprom::TYPE\u INT,4)
    //下一个
    添加_config_magic_宏(config,CONF_用户名,myeeprom::TYPE_STR,16);
    //让myeeprom计算配置字段的所有地址,
    //阅读它的价值观,做其他有用的事情。
    config.init();
    }
    
    正如我所发现的,如果没有boost预处理器,我无法创建静态递增常量宏,因此,不应该是这样

    我可以在add_config_magic_宏中使用一些非常量变量并递增它,但是,我现在不知道在函数内部调用此类宏时如何创建全局常量,并且我不能在函数外部运行此代码

    理想情况下,这应该是字段配置数组的编译时非动态初始化,因为arduino的运行时内存很少


    这个问题的答案没有帮助,因为我需要宏来创建全局常量,同时在函数结构中使用字符串创建局部常量。

    您可以写入和读取整个结构,为什么会这样?问题在于,我必须在字符串(字段名)中重复配置字段的名称twise:1)在常量名中重复2)在字符串中重复你尝试的完全方法是错误的。但是如果你真的想这样做,你可以用预处理器操作符@Juraj的可能重复项来字符串化一个变量或常量名称(感谢你与我所问的足够接近:)当然,我可以使用#VAR来创建宏参数的字符串,但问题是,宏应该把它的一部分放在函数中,和其他部分-外部。例如,add_config_magic_宏(config,CONF_BTN_ACTIVE,myeeprom::TYPE_BOOL,1)应该创建一行:const int CONF_BTN_ACTIVE=1;同时在函数中填充结构你可以写和读整个结构,为什么会这样?问题是,我必须重复配置字段的名称twise:1)在常量名中2)在字符串中(字段名)。你尝试的完整方法是错误的。但是如果你真的想这样做,你可以用预处理器操作符@Juraj的可能重复项来字符串化一个变量或常量名称(感谢你与我所问的足够接近:)当然,我可以使用#VAR来创建宏参数的字符串,但问题是,宏应该把它的一部分放在函数中,和其他部分-外部。例如,add_config_magic_宏(config,CONF_BTN_ACTIVE,myeeprom::TYPE_BOOL,1)应该创建一行:const int CONF_BTN_ACTIVE=1;并且还填充了结构内部的函数