我对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_len
、AKB_power
、AKB_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.mfr
、AKB.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