Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 如何使用可视化代码和平台IO将环境变量注入CPP文件?_C++_Arduino_Visual Studio Code_Platformio - Fatal编程技术网

C++ 如何使用可视化代码和平台IO将环境变量注入CPP文件?

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); } 上

从JS背景开始

我正在研究物联网的发展,希望在不上传个人WiFi的SSID和密码的情况下建立自己的回购协议

平台IO提供了这个
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