2012-03-12 10 views
7

Хорошо, я ищу, чтобы определить набор адресов памяти в качестве констант в файле .h, который используется кучей файлов .c (мы находимся на C, а не на C++). Я хочу видеть имя переменной вместо того, чтобы просто видеть гексаговый адрес в отладчике ... поэтому я хочу преобразовать #defines, которые у меня есть в настоящее время, в константы, глобальные по объему. Проблема заключается в том, если я определяю их как это:глобальные константы без использования #define

const short int SOME_ADDRESS = 0x0010 

тогда я получаю ужасную ошибку «несколько объявлений», так как у меня есть несколько .c файлов, используя тот же самый .h. Я хотел бы использовать перечисление, но это не сработает, поскольку по умолчанию он вводит целое число (это 16 бит в моей системе ... и мне нужно иметь более тонкий контроль над типом).

Я думал о том, чтобы поместить все адреса в структуру ... но у меня нет способа (я знаю) установить значения по умолчанию экземпляра структуры в файле заголовка (я не хочу предположим, что определенный .c-файл сначала использует структуру и заполняет ее в другом месте. Мне бы хотелось иметь константы, определенные в файле .h).

Казалось, это было так просто, когда я начал, но не знаю см. хороший способ определить глобально доступную короткую константу int в файле заголовка ... любой знает способ сделать это?

спасибо!

ответ

23

Объявляются константы в заголовочном файле с помощью extern:

extern const short int SOME_ADDRESS; 

тогда в любой, но только один, .c файл обеспечивает определение:

const short int SOME_ADDRESS = 0x0010; 
+0

Если я это сделаю, разве я не должен знать, что именно этот .c-файл вызывается первым? или если они определены глобально в этом .c файле, будет ли определение выполнено до вызова любой функции? –

+0

Нет, нет ничего, что можно было бы вызвать для инициализации констант, и определение будет присутствовать перед любыми попытками их использования. Просто убедитесь, что файл '.o' (или' .obj') файла '.c', где определены константы, связан с окончательным двоичным кодом. – hmjd

+0

он работает - спасибо !!! –

0

Если вы компилируете с GCC, вы можете добавить переключатель -ggdb3, в котором gcc будет хранить информацию о макросах (то есть #define), чтобы они могли использоваться внутри gdb.