реклама на сайте
подробности

 
 
> Как определить констатнты/перем. в .h файле для C ?, Нужно определить размеры массивов в .h файле для С
Саша Z
сообщение May 30 2007, 22:45
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Вопрос конечно чайниковский, сознаю, я пока к таким отношусь.. wink.gif
В коде С определены несколько массивов (ессно постоянного размера), например:
Код
int arr1[A], arr2[B],...

.
.
.

void main()
{
.
.


A,B - постоянные константы для всего проэкта, посему хочу дать их определение в .h файле где буду определять все константы и глобальные переменные. Сей .h файл includиться в С.
Как правильно определить A,B (и инициализировать) в .h файле что-бы их символьно использовать в С коде (в определении размеров массивов) ?

Пробовал:
Код
.h file:

extern int A = 5800;
extern int B = 2900;


Затем в С:
Код
int arr1[A], arr2[B];

void main()
{
.
.


Компилятор не берет ...
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 19)
Mokena
сообщение Oct 2 2007, 20:16
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 4-06-07
Пользователь №: 28 174



Подскажите, почему такое происходит в 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 определа несколько раз. Может быть дело в настройках компилятора/препроцессора?
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Oct 2 2007, 21:09
Сообщение #17


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



В глобальном списке имен появляются два одинаковых массива
const Uint16 SSDRegsPOR[0x50] = {
0x0000, 0x0000 .............
},
что, естественно, линкеру не нравиться.

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

Сообщение отредактировал mdmitry - Oct 2 2007, 21:10


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
PSP
сообщение Oct 2 2007, 21:23
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 1-10-07
Пользователь №: 30 988



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


#ifdef IMPLEMENT
#define EXTERN
#else
#define EXTERN extern
#endif

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


В свою очередь IMPLEMENT нужно определить только в одном .c файле, там и будет реализация массива. А во всех остальных он будем с модификаторм extern, т.е. только объявлен.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 3 2007, 08:30
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Mokena @ Oct 2 2007, 23:16) *
Про массивы уже сказали. Компилятор должен знать, где этот массив размещать. Когда вы включаете в заголовочный файл определение а не объявление массива - компилятор вынужден создать по копии массива в каждом из файлов. Если вас это не смущает - добавьте 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;, тогда компилятор вполне может не выделять под нее память и скомпилировать в опкод сразу значение константы, вместо ее чтения. Но при таком подходе нельзя брать адрес этой константы - иначе компилятор будет вынужден выделить под нее память.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Mokena
сообщение Oct 3 2007, 16:08
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 4-06-07
Пользователь №: 28 174



Ого, все оказалось чуточку сложнее, чем я представлял. Но теперь все ясно, всем большое спасибо.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016