Глобальные константы в файле .h, связывающие проблемы с gcc, работают с g ++ - PullRequest
1 голос
/ 26 августа 2011

У меня есть два файла .c и один файл .h из них обоих.В файле .h я объявил глобальные константы.При сборке с gcc я получаю проблемы со связыванием, говоря, что константы определены дважды, хотя у меня есть

#ifndef __FOO
#define __FOO

const struct foo bar = ...

#endif

Я получаю

/tmp/ccql6KF1.o:(.rodata+0x0): multiple definition of `bar'

Однако, компилируя тот же кодс g ++ работает отлично.Есть ли некоторые различия в том, как C и C ++ обрабатывают глобальные константы, объявленные в файлах .h?Какой подход я должен рассмотреть?

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

Ответы [ 2 ]

4 голосов
/ 26 августа 2011

Вы должны объявить константу в файле .h и определить ее в одном файле .c:

bar.h:

extern const struct foo bar;

bar.c:

#include "bar.h"

/* do this in a single file */
const struct foo bar = ...;

Затем включите bar.h везде, где вы хотите получить доступ bar:

что-то.c:

#include "bar.h"

void doSomethingWithBar() {
    struct *foo something = &bar;
    ...
}

Редактировать (Шахбаз): причина, почему этоработает, и ваш код не работает в том, что, когда вы включаете файл, содержимое этого файла копируется и вставляется вместо #include (это независимо от файла, вы можете включить что угодно, в том числе файлы с расширением .h простоконвенция).Поэтому, когда вы говорите const struct foo bar; в заголовочном файле и включаете его в два файла, это похоже на запись этой строки в обоих файлах, поэтому определение переменной в обоих файлах и, следовательно, ошибка ссылки.

Защита вашего заголовкатакже не работает (

#ifndef __BAR_H__
#define __BAR_H__
... header contents
#endif

), потому что каждый из ваших исходных файлов компилируется отдельно, поэтому, когда bar.h включен в один файл и определен __BAR_H__, когда компилируется следующий файлэто определение __BAR_H__ потеряно.

2 голосов
/ 26 августа 2011

Вы должны заявить только:

const struct foo bar;

и присвойте ему значение в файле .c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...