2 votes

Comment injecter des variables d'environnement dans un fichier CPP en utilisant Visual Code et Platform IO ?

Je commence à peine à m'intéresser à ce sujet, car je viens d'un milieu JS.

Je me penche sur le développement de l'IoT et je voulais mettre en place mon propre repo sans télécharger le SSID et le mot de passe de mon WiFi personnel.

Platform IO propose ceci platformio.ini comme je l'entends pour définir build_flags .

  build_flags = 
     -D SSID="MySSID"

Je ne sais pas comment y accéder à partir de mon fichier CPP. Je veux injecter la valeur du build flag SSID dans mon fichier *.cpp.

  #define SSID

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

Ce qui précède n'écrit rien sur le moniteur série.

Qu'est-ce qui ne va pas ? Le code est compilé.

2voto

dohpaz42 Points 477

Je sais que cela fait deux ans et que vous avez probablement tourné la page. Cependant, pour tous ceux qui, comme moi, tomberaient dessus en faisant une recherche sur Google, voici la réponse telle que je l'ai trouvée :

Según Variables dynamiques de PlatformIO vous définissez correctement la variable build afin qu'elle existe pour C++ (en tant que macro) ; c'est-à-dire, -DSSID="MySSID" . Ce que vous n'avez pas compris, cependant, c'est que les valeurs doivent être citées (et éventuellement échappées) : -DSSID='"MySSID"' de sorte que lorsque vous accédez à la macro en C++, il s'agit d'une const char * et non un symbole inconnu.

Voir l'avertissement au bas de la page, et noter les guillemets autour de la chaîne :

Sur les systèmes Unix, il faut faire attention aux caractères spéciaux dans les variables d'environnement du système, en particulier lorsqu'ils sont utilisés comme valeur pour les directives du préprocesseur. Les symboles tels que $, &, ~, etc. doivent être explicitement échappés, par exemple :

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

Ce n'était pas non plus évident pour moi au départ, mais c'est logique car le préprocesseur remplacera SSID avec ce que vous avez défini et ne fait aucune supposition à son sujet ou sur son type.

1voto

ladislas Points 916

Comme @Azeem l'a mentionné, vous redéfinissez le SSID à une valeur vide. En utilisant un préprocesseur comme celui-ci, vous devez d'abord vérifier si la valeur existe et si ce n'est pas le cas, lui assigner une valeur par défaut.

Voici un exemple simple en C++ :

#include <iostream>

#ifndef SSID
#define SSID "(SSID not defined)"
#endif

int main() 
{
    std::cout << "SSID value: " << SSID << std::endl;
    return 0;

}

Vous pouvez compiler et exécuter le code avec :

g++ main.cpp -o main && ./main

Comme vous le voyez, il imprime (SSID not defined) .

Maintenant, compiler et exécuter avec ce qui suit :

g++ main.cpp -o main -DSSID='"Hello, World!"' && ./main

s'affichera : SSID value: Hello, World!

Si vous souhaitez en savoir plus sur les directives de préprocesseur, cplusplus.com propose un tutoriel très intéressant

N'oubliez pas non plus de démarrer votre Serial en void setup() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X