2

刚从 JS 背景开始。

我正在研究物联网开发,并希望在不上传个人 WiFi 的 SSID 和密码的情况下建立自己的存储库。

platformio.ini据我了解,Platform IO 提供了这个设置build_flags

  build_flags = 
     -D SSID="MySSID"

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

  #define SSID

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

以上内容不会向串行监视器写入任何内容。

我究竟做错了什么?代码确实编译。

4

2 回答 2

2

我知道已经两年了,你可能已经从这个问题上移开了。但是,对于其他任何人——比如我自己——在谷歌搜索中遇到这种情况,这里是我找到的答案:

根据PlatformIO 的动态变量页面,您正确定义了构建变量,以便它存在于 C++(作为宏);即,-DSSID="MySSID"。但是,您错过的是值需要被引用(并且可能被转义):-DSSID='"MySSID"'这样当您在 C++ 中访问宏时,它是一个const char *字符串而不是未知符号。

请参阅页面底部的警告,并注意字符串周围的引号:

请注意 Unix 系统上系统环境变量中的特殊字符,尤其是当它们用作预处理器指令的值时。$、&、~等符号必须显式转义,例如:

export WIFI_PASS='\"my\~p\&a\\\$\$\$\$word\"'

最初对我来说也不是很明显,但这是有道理的,因为预处理器将替换SSID为您定义的任何内容,并且根本不对其或其类型进行任何假设。

于 2021-02-06T17:59:57.317 回答
1

正如@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 有非常好的教程

另外,不要忘记Serialvoid setup().

于 2018-10-01T07:31:07.597 回答