从JS背景开始。
我正在研究IoT开发,并希望设置自己的存储库而不上传我的个人WiFi的SSID和密码。
据我了解,平台IO提供了platformio.ini
来设置build_flags
。
build_flags =
-D SSID="MySSID"
我不知道如何从我的CPP文件访问它们。我想将构建标志SSID中的值注入到我的* .cpp文件中。
#define SSID
void loop()
{
Serial.println(SSID);
}
上面没有向串行监视器写入任何内容。
我在做什么错?代码会编译。
答案 0 :(得分:2)
我知道已经两年了,您可能已经离开了这个问题。但是,对于其他人 - 像我一样 - 在 Google 搜索中遇到这种情况,这是我找到的答案:
根据PlatformIO's Dynamic Variables页面,您正确定义了构建变量,使其存在于C++中(作为宏);即,-DSSID="MySSID"
。然而,您错过的是需要引用(并可能转义)的值:-DSSID='"MySSID"'
以便当您在 C++ 中访问宏时,它是一个 const char *
字符串而不是未知符号。< /p>
查看页面底部的警告,并注意字符串周围的引号:
<块引用>注意 Unix 系统上系统环境变量中的特殊字符,尤其是当它们用作预处理器指令的值时。像 $、&、~ 等符号必须显式转义,例如:
export WIFI_PASS='\"my\~p\&a\\\$\$\$\$word\"'
最初对我来说也不是很明显,但这是有道理的,因为预处理器会将 SSID
替换为您定义的任何内容,并且根本不对它或其类型做任何假设。
答案 1 :(得分:0)
正如@Azeem所述,您正在将SSID重新定义为一个空值。使用这样的预处理器,必须首先检查该值是否存在,如果不存在,则为其分配默认值。
这是一个简单的C ++示例:
#include <iostream>
#ifndef SSID
#define SSID "(SSID not defined)"
#endif
int main()
{
std::cout << "SSID value: " << SSID << std::endl;
return 0;
}
您可以使用以下代码编译并运行代码:
g++ main.cpp -o main && ./main
如您所见,它会打印(SSID not defined)
。
现在,编译并运行以下命令:
g++ main.cpp -o main -DSSID='"Hello, World!"' && ./main
将输出:SSID value: Hello, World!
如果您想了解有关预处理程序指令的更多信息,请cplusplus.com has very nice tutorial
此外,别忘了在Serial
中启动void setup()
。