Arduino C++取消引用#define或const int



我对C++非常生疏,所以如果这根本不是关于取消引用的问题,请原谅我。但我认为这是正确的术语。

我正在制作一个Arduino草图,以发送原始红外信号来模拟红外控制器。

为了实现这一点,我发送了一个JSON字符串,该字符串引用了我所包含的头文件中定义的信号。我想为每个控制器都有一个单独的文件,并且我想在每个头中使用#define语句来确保每个信号名称之间有良好的分隔。如果你愿意的话,有点像滚我自己的命名空间。

因此,在标题中,我有一个远程电源按钮的信号:

#include <stdint.h>
#include <Arduino.h>
#define AKB73575431_DATA_LEN 69
String AKB73575431_mfr = "LG";
uint16_t AKB73575431_power [AKB73575431_DATA_LEN] = {
4400,4600,550,600,500,600,550,1650,550,1700,
550,600,500,1700,550,600,550,600,500,600,
550,550,550,1700,550,1650,550,600,550,1700,
500,650,500,600,500,600,550,1700,550,1650,
600,1650,550,1700,550,600,500,600,550,600,
500,1700,550,600,550,550,550,600,500,600,
500,1700,600,1650,550,1700,550,1000
};

你们中的一些人可能会认为这种数据格式是直接从IRLib2教程中抄袭而来的。

我想发送一个JSON字符串:

{"cmd": "txIRraw", "key": "AKB73575431_power"}

我的问题是我能解析";键";值并使用子字符串:

AKB73575431

构建对定义的引用:

#define AKB73575431_DATA_LEN 69

如果做不到这一点,是否可以将define更改为全局int并取消引用它?

我一直在谷歌上搜索C++中的取消引用变量,但一直在获取指针页面。我想做的是从字符串中构造变量或#define名称,然后使用它。

这可能吗?如果可能,有人能给我举个例子吗?

非常感谢

Kali

如果我正确理解您的问题,您将尝试查看是否可以使用字符串"AKB73575431"来创建一个名称为AKB73575431的变量,并为其分配AKB_LEN的值。

快速的答案是否定的。你不能基于另一个字符串的值来创建变量名。

有两种不同的方法可以用来获得类似的效果(我想(。


首先,您可以使用宏。

你可以采取其他方式。假设要创建前缀为AKB_的多个变量,例如AKB_lenAKB_powerAKB_mfr。你可以用宏:

#define create(NAME, VALUE) decltype(VALUE) AKB_##NAME{VALUE}

所以你可以像这样使用它:

create(LEN, 10); // create a variable called `AKB_LEN`, and has the value of 10

或:

string s = "abc";
create(S, s); // create a variable called `AKB_S`, and has the type string and value "abc"

但是,我不建议这样做。很难获得您创建的变量名,因为它们隐藏在宏下。如果你有另一个名字不同的遥控器,你需要创建一个全新的宏函数,让它们工作。


第二种方法是通过OOP。您将创建一个Remote类,并且Remote可能具有不同的成员,例如name、mfr和power:

struct Remote
{
std::string name;
std::string mfr;
std::vector<int> power;
}

然后你可以创建Remote,比如:

Remote AKB{"AKB", AKB_mfr, {std::being(AKB_power}, std::end(AKB_power)};

然后你可以用AKB.mfrAKB.power之类的东西访问它的数据


此外,您还可以在没有name成员的情况下创建Remote类,并将远程存储在映射容器中:

struct Remote
{
std::string mfr;
std::vector<int> power;
}

然后你可以创建一个类似的地图:

std::map<std::string, Remote> Remotes;

并在地图上添加新的遥控器,如:

Remotes.emplace("AKB", Remote{AKB_mfr, {std::begin(AKB_power), std::end(AKB_power)}});

现在,如果你想从地图上访问一个名为"AKB"的遥控器,你可以执行以下操作:

Remotes["AKB"].mfr

最新更新