C++ 如何使用可视化代码和平台IO将环境变量注入CPP文件?
从JS背景开始 我正在研究物联网的发展,希望在不上传个人WiFi的SSID和密码的情况下建立自己的回购协议 平台IO提供了这个C++ 如何使用可视化代码和平台IO将环境变量注入CPP文件?,c++,arduino,visual-studio-code,platformio,C++,Arduino,Visual Studio Code,Platformio,从JS背景开始 我正在研究物联网的发展,希望在不上传个人WiFi的SSID和密码的情况下建立自己的回购协议 平台IO提供了这个platformio.ini,据我所知,设置build\u标志 build_flags = -D SSID="MySSID" 但我不知道如何从我的CPP文件中访问它们。我想将生成标志SSID中的值注入到我的*.cpp文件中 #define SSID void loop() { Serial.println(SSID); } 上
platformio.ini
,据我所知,设置build\u标志
build_flags =
-D SSID="MySSID"
但我不知道如何从我的CPP文件中访问它们。我想将生成标志SSID中的值注入到我的*.cpp文件中
#define SSID
void loop()
{
Serial.println(SSID);
}
上面的命令不会向串行监视器写入任何内容
我做错了什么?代码确实可以编译。正如@Azeem提到的,您正在将SSID重新定义为空值。使用这样的预处理器,您必须首先检查该值是否存在,如果不存在,则为其指定一个默认值
这里是一个简单的C++例子:
#include <iostream>
#ifndef SSID
#define SSID "(SSID not defined)"
#endif
int main()
{
std::cout << "SSID value: " << SSID << std::endl;
return 0;
}
如您所见,它打印(未定义SSID)
现在,使用以下命令编译和运行:
g++ main.cpp -o main -DSSID='"Hello, World!"' && ./main
将输出:SSID值:你好,世界代码>
如果您想了解有关预处理器指令的更多信息
另外,别忘了在void setup()
中启动您的串行
,我知道已经两年了,您可能已经离开了这个问题。然而,对于像我这样在谷歌搜索中遇到这种情况的人来说,我找到了一个答案:
根据Page,您正确定义生成变量,以便它存在于C++(作为宏);i、 例如,
-DSSID=“MySSID”
。但是,你错过的是需要引用的值(并且可能被逃逸):<代码> -DSSID =“Myssid”'/Cuff>,这样当你访问C++中的宏时,它是一个<代码> const char */COS>字符串,而不是一个未知符号。
请参阅页面底部的警告,并注意字符串周围的引号:
在Unix系统上,请小心使用系统环境变量中的特殊字符,尤其是当它们用作预处理器指令的值时。美元、&、~、等符号必须显式转义,例如:
export WIFI\u PASS='\'my\~p\&a\\\$\$\$\$word\'
这对我来说一开始也不明显,但这是有意义的,因为预处理器将用您定义的任何内容替换SSID
,并且对它或它的类型完全不做任何假设。它不是.cpp
文件吗?您编写了.ccp
文件。是的,它是。但是我在标题中写了正确的一个。从和,代码中翻译了build\u标志
中的-D
指令。因此,您只需要在platformio.ini
中定义它们,然后就可以在代码中直接使用它们。你不需要在代码中单独定义它们。是的,这也是我理解的。但是,可视化代码会抛出一个编译错误:“找不到数值文本运算符”运算符“FritzBox”对。我相信这是VS和arduino编译器的某种配置问题。你可能想针对这个问题写一个不同的问题。
g++ main.cpp -o main -DSSID='"Hello, World!"' && ./main