2015-11-13 3 views
1

Я знаю, это было предложено несколько раз, но не мог найти должность, относящуюся к этой конкретной проблемы:Arduino библиотеки: несколько определений глобальной переменной

# config.h 
String g_ssid = ""; 

# webserver.cpp 
#include "config.h" 

bool saveConfig(String *ssid, String *pass) 
{ 
    // Open config file for writing. 
    File configFile = SPIFFS.open("/cl_conf.txt", "w"); 
    if (!configFile) 
    { 
    Serial.println("Failed to open cl_conf.txt for writing"); 
    return false; 
    } 

    // Save SSID and PSK. 
    configFile.println(*ssid); 
    configFile.println(*pass); 
    configFile.close(); // <-- error in this line??? 

    return true; 
} // saveConfig 

Compile ошибки:

webserver.cpp.o: In function `saveConfig(String*, String*)': 
C:\Users\AppData\Local\Temp\build9148105163386366718.tmp/webserver.cpp:114: multiple definition of `g_pass' 

Декларирование в инлайн не представляется возможным, поскольку компилятор жалуется:

'g_ssid' declared as an 'inline' variable 

Очевидно extern переменная из config.h не имеет большого смысла в отношении конфигурации config.h. Как это можно решить?

+0

Ошибка компиляции, похоже, что это не имеет никакого отношения к коду, который вы опубликовали? Что внутри webserver.cpp, которое несколько раз задает g_pass? – Unimportant

+0

Обновлено. Мне интересно, возможно ли определение в заголовке вообще, поскольку все ответы указывают на перемещение определения в файл c или вложение. Оба здесь не применимы. – andig

ответ

1

Вы бы объявить переменная в файле заголовка:

String g_ssid; 

и определяют его в CPP файле:

String g_ssid = ""; 

Таким образом, заголовок может быть включено несколько раз без переопределения переменной.

См. this SO question для получения более подробной информации о различии между объявлением и определением.

+0

Это означает, что наилучшая практика для глобальных переменных определяет их в .cpp-файле, а не в .h? – andig

+0

Это правильно. – Kenney

Смежные вопросы