внешний массив выходит неопределенной ошибкой ссылки, но хорошо работает для int - PullRequest
1 голос
/ 26 марта 2020

ошибка компиляции: [build] main. cpp: 8: неопределенная ссылка на `pallete '

пример кода: общий. cpp

const unsigned char pallete[] = {0, 60, 100, 119};
int a = 1;

main. cpp

#include <iostream>

extern const unsigned char pallete[];
extern int a;

int main() {
    std::cout << a << std::endl;
    std::cout << pallete[0] << std::endl;
    return 0;
}


Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Вы должны объявить паллету extern в common.cpp. Прямо сейчас main.cpp знает, что он должен "искать" паллету в отдельном файле, но common.cpp рассматривает его как локальный из-за того, что const, как сказано здесь https://en.cppreference.com/w/cpp/language/cv#Notes

Примечания

Определитель const, используемый в объявлении нелокальной энергонезависимой (не начиная с C ++ 14) не встроенной (начиная с C ++ 17) переменной, которая не была объявлена extern дает ему внутреннюю связь. Это отличается от C, где переменные области действия файла const имеют внешнюю связь.

extern const unsigned char pallete[] = {0, 60, 100, 119};
int a = 1;
0 голосов
/ 26 марта 2020

Скорее всего, ваш компилятор делает то, о чем мой предупреждает: Warnung: variable 'pallete' is not needed and will not be emitted

Если вы добавите оператор extern также в common.cpp, он должен работать.

Если вы объявите что-то extern вы всегда должны делать это в каком-то заголовке, который включен всеми, кто хочет использовать переменную.

...