2015-10-22 3 views
0

У меня возникла проблема с определением моего настраиваемого объекта структуры как глобального с использованием ключевого слова extern, чтобы я мог использовать его в большем количестве исходных файлов. Я попробовал несколько вариантов, но до сих пор я не мог построить свой проект без ошибок. Это то, что я до сих пор:Использование ключевого слова extern для определения глобальной переменной по нескольким исходным файлам

main.h

#ifndef _MAIN_H_ 
#define _MAIN_H_ 

#include "pins.h" 
#include "bluetooth.h" 

const pin P0_21; 
const pin P0_22; 
const pin P0_27; 

#endif 

bluetooth.h

#ifndef _BLUETOOTH_H_ 
#define _BLUETOOTH_H_ 

#include "pins.h" 

void EnableBT(void); 

const pin BT_ENABLE; 
const pin P2_0; 

#endif 

pins.h

#ifndef _PINS_H_ 
#define _PINS_H_ 

typedef struct 
{ 
    int port; 
    int pin; 
    int jump_phase; 
    int jump_counter; 
} pin; 

extern const pin P0_21; 
extern const pin P0_22; 
extern const pin P0_27; 
extern const pin BT_ENABLE; 
extern const pin P2_0; 
extern const pin P2_2; 
extern const pin P2_3; 
extern const pin P2_7; 

void InitPins(void); 

#endif 

main.c

#include "main.h" 

int main() 
{ 
    InitPins(); 

    /* Using pins from main.h */ 
} 

bluetooth.c

#include "bluetooth.h" 

void EnableBT() 
{ 
    /* Use pins in bluetooth.h */ 
} 

pins.c

#include "pins.h" 

void InitPins() 
{ 
    pin P0_21 = {0,21,0,0}; 
    pin P0_22 = {0,22,0,0}; 
    pin P0_27 = {0,27,0,0}; 
    pin BT_ENABLE = {0,10,0,0}; 
    pin P2_0 = {2,0,0,0}; 
    pin P2_2 = {2,2,0,0}; 
    pin P2_3 = {2,3,0,0}; 
    pin P2_7 = {2,7,0,0}; 
} 

Когда я удалить ссылки на ехЬегп штырей BT_ENABLe и P2_0 в bluetooth.h, компилятор говорит, что эти объекты ссылаются из bluetooth.c не определены. Но когда я их оставляю, компилятор говорит, что они размножаются по bluetooth.o и main.o.

У меня нет больше идей, как изменить свой код, чтобы заставить его работать. Спасибо за любой совет.

+1

Всмотритесь в [Как использовать 'extern' разделить переменные между исходными файлами в C?] (Https://stackoverflow.com/questions/1433204 /) –

+1

Вы объявляете * новые * локальные переменные в 'InitPins'. –

+2

Локальные переменные в 'InitPins()' имеют только совпадающее отношение к именам, объявленным в заголовках. Имена в заголовках - это глобальные переменные; функции в функции доступны только функцией. Некоторый исходный файл ('.c' file) должен определять переменные вне любой функции. –

ответ

0

удалить линии

const pin P0_21; 
const pin P0_22; 
const pin P0_27; 

и

const pin BT_ENABLE; 
const pin P2_0; 

из main.h и bluetooth.h и поместить их в pins.c непосредственно перед определениями InitPins(). И Инициализировать глобалы inline:

#include "pins.h" 

const pin P0_21 = {0,21,0,0}; 
const pin P0_22 = {0,22,0,0}; 


void InitPins() 
{ 
... 

Удалите эти инициализации в InitPins().

В качестве альтернативы вы можете сохранить инициализации в InitPins(), но удалите ключевые слова const в выводах pin-файлов в файле pins.c.

В других файлов, использующих эти контакты, включают pins.h