2012-01-20 6 views
0

Я пробовал много решений, но не могу заставить свою программу работать.Глобальные переменные, C++

main.h

short NWMP_acc[3]; 
short NWMP_gyro[3]; 

main.cpp

printf_("%i,%i,%i, g\n", NWMP_gyro[YAW],NWMP_gyro[PITCH],NWMP_gyro[ROLL]); 

other.cpp

#include "main.h" 
NWMP_gyro[YAW] = (((buf[3]>>2)<<8) + buffer[0]);//multiple definition of `NWMP_gyro' 

Если изменить на "ехЬегп короткий NWMP_acc [3];" чем я получаю ошибку "неопределенная ссылка на` NWMP_acc "

+1

'printf_' выглядит как C не C++, но очень странный C. – Flexo

+0

Вы хотите объявить * существование * глобальных переменных в заголовке, но вам нужно определить их где-то только в одном исходном файле. – dreamlax

ответ

6

Вам нужно с и без extern

В вашем заголовке вам необходимо:

extern short NWMP_acc[3]; 
extern short NWMP_gyro[3]; 

Но в одном из ваших" .cpp «файлы вам все еще нужно:

short NWMP_acc[3]; 
short NWMP_gyro[3]; 

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

+0

Являются ли эти переменные доступными для изменения из других .cpp-файлов? – SevenDays

+0

@wsevendays: Да, потому что он объявлен как «extern». –

+0

@wsevendays Да, все остальные места, которые видят в декларации 'extern', будут использовать одно единственное определение, которое вы предоставляете, но вы должны предоставить ровно одно определение где-то еще. – Flexo

4

Если вы объявить массив как extern (который вы должны, если вы хотите, глобальную переменную через единицы перевода), вы должны определить это ровно в одной единице трансляции. Так, например,

// main.h 
extern short NWMP_acc[3]; // declare 

// main.cpp 
#include "main.h" 
short NWMP_acc[3]; // define 

// other.cpp  
#include "main.h" 

void foo() { 
    std::cout << NWMP_acc[0] << std::endl; //just use, don't define again 
} 
+0

+1 для использования терминов declare/define. – unwind

Смежные вопросы