Внешняя переменная в заголовочном файле неправильно связана с исходным файлом, в котором она определена - PullRequest
0 голосов
/ 30 сентября 2011

Проблема: переменная VarOriginal определена в исходном файле C под прагмой скажем «параметр X» и объявлена ​​как переменная extern в заголовочном файле под той же самой прагмой «параметр X». Существует процесс, использующий его, в котором известно, что переменная показана объявленной в каком-то другом заголовочном файле, где эта переменная вообще отсутствует.

В качестве обходного пути: я объявил еще одну другую переменную 'VarNew' перед прагмой 'parameterX' в файле заголовка и аналогично определил переменную 'VarNew' перед строкой, в которой был определен 'VarOriginal'. И все заработало.

Заголовочный файл: header_file_with_problem.h

#ifndef HEADER_FILE_WITH_PROBLEM_H

#define HEADER_FILE_WITH_PROBLEM_H

#include "ABC.h"

здесь объявить переменную VarNew <------ </p>

#pragma BSS(".parameterX")

extern int VarOriginal;

#pragma BSS(DEFAULT_SECTION_BSS)

Исходный файл C:

#define  HEADER_FILE_WITH_PROBLEM_C

#include "XYZ.h"

#include "header_file_with_problem.h"

здесь объявить переменную VarNew <------ </p>

#pragma BSS(".parameterX")

int VarOriginal;

#pragma BSS(DEFAULT_SECTION_BSS)

Но я не могу понять, почему проблема возникла раньше. Почему компоновщик не смог найти определение «VarOriginal» в исходном файле, и теперь он может это сделать после объявления другой переменной перед самим «VarOriginal»?

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

1 Ответ

2 голосов
/ 30 сентября 2011

Я не вижу ничего определенного в вашем исходном файле.

extern int VarOriginal;

по-прежнему является неопределяемым объявлением , независимо от того, где вы его поместили (исходный файл или файл заголовка). В вашем примере кода нет ни одного определения переменной, поэтому неудивительно, что компоновщик жалуется на отсутствие определений.

Чтобы определить переменную в вашем C-файле, вам нужно сделать либо

int VarOriginal; /* no `extern` !!! */

или добавить явный инициализатор

extern int VarOriginal = 0; /* definition */

Простой

extern int VarOriginal; /* not a definition!!! */

то, что у вас там сейчас (согласно тому, что вы разместили), не является определением.

...