C ++ Как правильно инициализировать глобальные переменные? [Дубликат]

0

Я пишу небольшой студенческий проект и застрял в проблеме, что у меня есть несколько глобальных переменных, и мне нужно использовать его в нескольких исходных файлах, но я получаю сообщение об ошибке * undefined для переменной_имя *. Позвольте создать три исходных файла, например:

tst1.h:

extern int global_a;
void Init();

tst1.cpp:

#include "tst1.h"
void Init(){
  global_a = 1;
}

tst2.cpp:

#include "tst1.h"
int main(){
  Init();
}

Когда я компилирую и связываю, что я получаю:

$ g++ -c tst1.cpp 
$ g++ -c tst2.cpp 
$ g++ tst2.o tst1.o
tst1.o: In function 'Init()':
tst1.cpp:(.text+0x6): undefined reference to 'global_a'
collect2: error: ld returned 1 exit status

Если я удалю extern выражение, то я получаю другую проблему, позвольте мне показать:

$ g++ -c tst1.cpp 
$ g++ -c tst2.cpp 
$ g++ tst2.o tst1.o
tst1.o:(.bss+0x0): multiple definition of 'global_a'
tst2.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

Но мне действительно нужно, чтобы переменные были глобальными, например, мой маленький проект работает с кодом сборки и имеет переменные, такие как строка rax = "% rax% eax% ax% ah% al"; на которые должны ссылаться различные исходные файлы.

Итак, как правильно инициализировать глобальные переменные?

  • 2
    Лучшее решение для этого - не использовать глобалы. Для подсказки о том, как их можно избежать: внедрение зависимости.
  • 0
    @ Тим, я знаю, что глобальные переменные - это плохой стиль, но в некоторых ситуациях это правильный путь. Например, если мой проект работает со сборкой, многие файлы должны знать имена регистров ЦП и переменную string rax = "%rax %eax %ax %ah %al"; должны быть ссылки через разные исходные файлы.
Показать ещё 1 комментарий
Теги:
variables
global-variables

3 ответа

3
Лучший ответ

Вы только объявили переменную, но не определили ее. Эта запись

extern int global_a;

является декларацией, а не определением. Чтобы определить его, вы могли бы в любом модуле писать

int global_a;

Или было бы лучше определить функцию init следующим образом

int Init { /* some code */; return 1; }

и в основном модуле перед началом функции main

int global_a = Init();
  • 0
    Как я прокомментировал ниже, компилятор говорит tst1.cpp:2:5: error: redefinition of 'int global_a .
  • 0
    Извините, я не понял, что вы прокомментировали. Я показал соответствующий код. Вы не можете просто скопировать и вставить его?
Показать ещё 4 комментария
2

tst1.cpp должен читать вместо этого:

#include "tst1.h"

int global_a = 1;

void Init(){  
}

Вы также можете написать строку инициализации как:

int global_a(1);

Или в С++ 11:

int global_a{1};

Глобальный должен быть определен (т.е. Написан без extern префикса) в одном исходном файле, а не в файле заголовка.

  • 0
    Нет, вот что я получаю: tst1.cpp:2:5: error: redefinition of 'int global_a' int global_a = 33; ^ In file included from tst1.cpp:1:0: tst1.h:1:5: error: 'int global_a' previously declared here int global_a; ^
  • 0
    Извините за форматирование. tst1.cpp:2:5: error: redefinition of 'int global_a'
Показать ещё 3 комментария
0

вам нужно добавить

#ifndef TST1_H
#define TST1_H
.....
#endif 

до tst1.h. он дважды включался в tst2.cpp

  • 1
    Нет, он не включен дважды, он компилируется дважды (в разных единицах перевода). Включенный охранник не решает это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню