【问题标题】:How to inject environment variables into CPP file using Visual Code and Platform IO?如何使用 Visual Code 和 Platform IO 将环境变量注入 CPP 文件?
【发布时间】:2018-09-30 18:00:04
【问题描述】:

从这个来自 JS 背景开始。

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

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

  build_flags = 
     -D SSID="MySSID"

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

  #define SSID

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

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

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

【问题讨论】:

  • 不是.cpp 文件吗?你写了.ccp 文件。
  • 是的。不过我在标题中写对了。
  • documentation 和这个examplebuild_flags 中的-D 指令在代码中被翻译。因此,您只需在 platformio.ini 中定义它们,然后您就可以直接在代码中使用它们。你不需要在代码中单独#define它们。
  • 是的,我也是这么理解的。然而,Visual Code 抛出编译错误:`unable to find numeric literal operator 'operator"" FritzBox'
  • 对。我相信这是VS和arduino编译器的某种配置问题。您可能想针对该问题编写一个不同的问题。

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


【解决方案1】:

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

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

查看页面底部的警告,并注意字符串周围的引号:

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

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

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

【讨论】:

    【解决方案2】:

    正如@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

    另外,不要忘记在void setup() 中开始您的Serial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2011-09-11
      • 2020-08-23
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多