C extern переменная доступ - PullRequest
2 голосов
/ 28 марта 2012

У меня есть заголовочный файл, в котором объявлена ​​переменная extern.

Так что это будет выглядеть примерно так в этом файле .h

  extern uint16_t externVariable;

Итак, у меня есть 2 .c файла b и c, в которых я хочу получить доступ к переменной extern в файле a.h. в файлах b и c .c я уже включил файл .h

Когда я не объявил переменную в b, но объявил в c (без слова extern), что-то вроде

 uint16_t externVariable;

Работает нормально. Но когда его и в б и в у меня есть некоторые ошибки компиляции. Есть ли способ решить эту проблему?

Причина для этого, потому что у меня есть код в файле .c, который я хочу разделить код на 2 разных файла .c для аккуратности и ясности.

Ответы [ 3 ]

5 голосов
/ 28 марта 2012

Переменная должна быть объявлена ​​только в одном файле исходного кода. (файл b.c в вашем примере).

Объявляя его extern в заголовочном файле или даже в верхней части нескольких .c файлов, вы, по сути, заявляете, что «переменная здесь не находится, она внешняя. Но она существует, и она будет виден вам. "

Переменная должна «жить» только в одном файле.

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

1 голос
/ 28 марта 2012

"extern" сообщает компилятору C, что эта функция или переменная была объявлена ​​в другом месте, поэтому вы можете использовать их даже без объявления их в заголовочных файлах и включения .h в файлы .c. Осторожно, «extern» означает, что эта переменная НЕ была начальным объявлением, начальное объявление НЕ ДОЛЖНО иметь ключевое слово extern.

В вашем случае вы объявили переменную extern в одном файле, не добавляя ключевое слово «static», поэтому областью действия переменной будет весь проект. Затем вы объявили "uint16_t externVariable;" в двух местах компилятор решил, что все они изначально имеют одинаковые имена, поэтому начался конфликт.

Например, вы можете сделать что-то вроде этого:

Пример 1:

a.c: uint16_t externVariable;

b.c: extern uint16_t externVariable;

Не беспокойтесь о вашем заголовочном файле, вы можете использовать externVariable как в a.c, так и в b.c.

Пример 2:

a.c: #include "a.h"

b.c: #include "a.h"

a.h: uint16_t externVariable;

Это работает.

Пример 3:

a.c: extern uint16_t externVariable;

b.c: uint16_t externVariable;

c.c: uint16_t externVariable;

Это не сработает, поскольку вы объявили externVariable в нескольких местах.

Пример 4:

a.c: статический uint16_t externVariable;

b.c: статический uint16_t externVariable;

Это БУДЕТ работать, так как ключевое слово "static" ограничило их области действия, поэтому они не будут конфликтовать.

Пример 5:

a.c: статический uint16_t externVariable;

b.c: статический uint16_t externVariable;

c.c: extern uint16_t externVariable;

Это все равно не будет работать, так как ключевое слово "static" ограничило их области действия, и компилятор не может найти, где вы объявили externVariable в c.c.

Вы также можете просмотреть TCPL, он дал большую картину об этих ключевых словах, надеюсь, эти примеры могут помочь:)

0 голосов
/ 28 марта 2012

Идея extern состоит в том, чтобы сообщить компилятору, что эта переменная размещена в исходном файле различий, поэтому не необходимо объявить его снова в другом исходном файле. Просто оставьте его в одном файле (я бы сказал, a.cpp, поскольку он находится в a.h) и включите a.h, и он будет работать со всеми файлами .cpp.

...