глобальные переменные c++ в нескольких файлах

у меня есть код, разбросанный по трем файлам, и я хотел бы использовать четвертый файл "gloabls" для хранения некоторых физических констант, таких как значение pi. Это позволит избежать повторяющихся определений pi = 4*atan(1.0). После того, как я попробовал создать глобальный файл заголовка:

/*globals.h*/
extern double g_pi;

и глобальный cpp-файл:

/*globals.cpp*/
#include "math.h"
#include "globals.h"
double g_pi = 4*atan(1.0);

затем я включаю этот файл в свои основные файлы:

/*mainFile.cpp*/
//Include math and other libraries 
#include globals.h"
int main() {
/*
....
*/
double x = 2*g_pi
/*
....
*/
}

это дает мне неопределенную ошибку ссылки на g_pi. Я использую компилятор g++ на Ubuntu. Надеюсь, это простое исправление! Ваши предложения очень ценятся. Если понадобится больше подробностей, я буду рад предоставить их.

4 ответов


вы можете просто использовать M_PI из include (есть и другие константы).

Edit: ваша настройка верна. Я получил рабочий пример minmal:

глобалы.h

extern double g_tst;

глобалы.cpp

#include "globals.h"
double g_tst = 4.0;

main.cpp

#include "globals.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
fprintf (stderr, "g_tst  = %lf \n", g_tst);
return 0;
}

проблема находится в вашей buildsystem

посмотреть Википедия


Я думаю, проблема в том, что у вас есть #include gobals.h вместо #включить глобалы.h. Это даст вам неопределенные ссылки, потому что он не вставляет глобалы.h. Прекомпилятор C++ не терпит неудачу, когда он не может найти файл заголовка. Вместо этого вы получаете неопределенное ссылочное сообщение при компиляции.


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


g_pi musst не объявляется extern в одной единице перевода. Вы можете использовать небольшой #define для этого

в Globals.cpp

#define MY_EXTERN_CPP

в /*глобальные переменные.h

#ifdef MY_EXTERN_CPP
    #define MY_CONFIGURATION_EXTERN
#else
    #define MY_CONFIGURATION_EXTERN extern
#endif

MY_CONFIGURATION_EXTERN double g_pi;

таким образом, g_pi будет extern во всех единицах перевода, которые вы включаете, кроме глобалов.cpp