Mokena 0 2 октября, 2007 Опубликовано 2 октября, 2007 · Жалоба Подскажите, почему такое происходит в Code Composer Studio: В .h файле есть такое определение массива: #ifndef SSD_API_H #define SSD_API_H #ifndef SSD_REGS #define SSD_REGS // Значения регистров после POR const Uint16 SSDRegsPOR[0x50] = { 0x0000, 0x0000 ............. } #endif // SSD_REGS #endif // SSD_API_H Этот файл включается в два .c файла. И в этом случае компилятор сообщает, что константа SSDRegsPOR определа несколько раз. Может быть дело в настройках компилятора/препроцессора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 2 октября, 2007 Опубликовано 2 октября, 2007 (изменено) · Жалоба В глобальном списке имен появляются два одинаковых массива const Uint16 SSDRegsPOR[0x50] = { 0x0000, 0x0000 ............. }, что, естественно, линкеру не нравиться. ИМХО, лучше массивы в заголовочных файлах не определять, тем более глобальные. Решение: определить в одном файле исходного текста, а в друггм ссылаться через extern. Изменено 2 октября, 2007 пользователем mdmitry Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
PSP 0 2 октября, 2007 Опубликовано 2 октября, 2007 · Жалоба Если всетаки хочется определить переменную/массив в .h файле, то можно воспользоваться манипуляциями с extern. #ifdef IMPLEMENT #define EXTERN #else #define EXTERN extern #endif EXTERN const Uint16 SSDRegsPOR[0x50] = {... В свою очередь IMPLEMENT нужно определить только в одном .c файле, там и будет реализация массива. А во всех остальных он будем с модификаторм extern, т.е. только объявлен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба Про массивы уже сказали. Компилятор должен знать, где этот массив размещать. Когда вы включаете в заголовочный файл определение а не объявление массива - компилятор вынужден создать по копии массива в каждом из файлов. Если вас это не смущает - добавьте static перед определением массива. Тогда каждая копия массива будет видна только внутри этого .c файла. Но это некрасивое решение. Правильнее объявить массив в .h как extern, а определить его в одном из .с:array.h: extern uint8_t array[size]; file1.c: #include "array.h" uint8_t array[size] = { ..... ..... }; file2.c: #include "array.h" А вот для обычных констант как раз наоборот - можно определять их в .h как static uint8_t const Const1 = 123;, тогда компилятор вполне может не выделять под нее память и скомпилировать в опкод сразу значение константы, вместо ее чтения. Но при таком подходе нельзя брать адрес этой константы - иначе компилятор будет вынужден выделить под нее память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mokena 0 3 октября, 2007 Опубликовано 3 октября, 2007 · Жалоба Ого, все оказалось чуточку сложнее, чем я представлял. Но теперь все ясно, всем большое спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться