Перейти к содержанию
    

Как определить констатнты/перем. в .h файле для C ?

Подскажите, почему такое происходит в 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 определа несколько раз. Может быть дело в настройках компилятора/препроцессора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В глобальном списке имен появляются два одинаковых массива

const Uint16 SSDRegsPOR[0x50] = {

0x0000, 0x0000 .............

},

что, естественно, линкеру не нравиться.

 

ИМХО, лучше массивы в заголовочных файлах не определять, тем более глобальные.

Решение: определить в одном файле исходного текста, а в друггм ссылаться через extern.

Изменено пользователем mdmitry

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если всетаки хочется определить переменную/массив в .h файле, то можно воспользоваться манипуляциями с extern.

 

 

#ifdef IMPLEMENT

#define EXTERN

#else

#define EXTERN extern

#endif

 

EXTERN const Uint16 SSDRegsPOR[0x50] = {...

 

 

В свою очередь IMPLEMENT нужно определить только в одном .c файле, там и будет реализация массива. А во всех остальных он будем с модификаторм extern, т.е. только объявлен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про массивы уже сказали. Компилятор должен знать, где этот массив размещать. Когда вы включаете в заголовочный файл определение а не объявление массива - компилятор вынужден создать по копии массива в каждом из файлов. Если вас это не смущает - добавьте 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;, тогда компилятор вполне может не выделять под нее память и скомпилировать в опкод сразу значение константы, вместо ее чтения. Но при таком подходе нельзя брать адрес этой константы - иначе компилятор будет вынужден выделить под нее память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ого, все оказалось чуточку сложнее, чем я представлял. Но теперь все ясно, всем большое спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...