如何使用Visual Code和Platform IO将环境变量注入CPP文件?

时间:2018-09-30 18:00:04

标签: c++ arduino visual-studio-code platformio

从JS背景开始。

我正在研究IoT开发,并希望设置自己的存储库而不上传我的个人WiFi的SSID和密码。

据我了解,平台IO提供了platformio.ini来设置build_flags

  build_flags = 
     -D SSID="MySSID"

我不知道如何从我的CPP文件访问它们。我想将构建标志SSID中的值注入到我的* .cpp文件中。

  #define SSID

  void loop()
  {
    Serial.println(SSID);
  }

上面没有向串行监视器写入任何内容。

我在做什么错?代码会编译。

2 个答案:

答案 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()