проблемы с глобальной переменной, разделяемой между исходными файлами (я использую include guards) - PullRequest
5 голосов
/ 15 августа 2010

Я пытаюсь разделить одну и ту же переменную между двумя файлами .cpp, они включают в себя один и тот же файл .h.

Но я получаю ошибки при связывании, сообщая, что у меня несколько определений.Что я нахожу неловким, так как я использую include guard

//main.cpp
#include <cstdio>
#include "shared.h"

int main(){
  shared_int = 5;
  printVal();
  return 0;
}


//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
int shared_int;
int printVal();
#endif

//shared.cpp
#include <cstdio>
#include "shared.h"


int printVal(){
  fprintf(stderr,"a: %d\n",shared_int);
  return 0;
}

Я сочиняю как

g++ shared.cpp -c;g++ main.cpp shared.o
shared.o:(.bss+0x0): multiple definition of `shared_int'
/tmp/cci8w8Am.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

спасибо

Обновление: 'extern' все еще неработать, но теперь я получаю неопределенную ссылку Это обновленные файлы

//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
//extern "C" int shared_int;//i've tried both
extern int shared_int;
int printVal();
#endif

//shared.cpp
#include <cstdio>
#include "shared.h"

int printVal(){
  fprintf(stderr,"a: %d\n",shared_int);
  return 0;
}

//main.cpp
#include <cstdio>
#include "shared.h"

int main(){
  int shared_int = 5;
  printVal();
  return 0;
}

Вот как я компилирую

g++ main.cpp shared.o
shared.o: In function `printVal()':
shared.cpp:(.text+0x6): undefined reference to `shared_int'
collect2: ld returned 1 exit status

Ответы [ 3 ]

15 голосов
/ 15 августа 2010

Для объявления в вашем заголовочном файле требуется extern:

extern int shared_int;

Затем вам понадобится фактический экземпляр определения в одном файле C ++ (например, в shared.cpp):

int shared_int;

Используемые здесь охранники включения являются хорошей практикой, но в этой ситуации они не будут иметь никакого эффекта.Защита включения предотвращает включение файла заголовка более одного раза в один и тот же исходный файл.Такая ситуация обычно не происходит, если у вас нет заголовочных файлов, косвенно включенных из других заголовочных файлов.

0 голосов
/ 11 июля 2014

ты очень скоро:

//shared.h
#ifndef INCLUDE_GUARD_H
#define INCLUDE_GUARD_H
#include <cstdio>
#include <cstdlib>
//extern "C" int shared_int;//i've tried both
extern int shared_int;
int printVal();
#endif

//shared.cpp
#include <cstdio>
#include "shared.h"

int printVal(){
  fprintf(stderr,"a: %d\n",shared_int);
  return 0;
}

//main.cpp
#include <cstdio>
#include "shared.h"

int shared_int = 0; // definition (extern ... is declaration)
                    // initialize force definition

int main(){
  shared_int = 5;
  printVal();
  return 0;

}

0 голосов
/ 15 августа 2010

Во-первых, глобалы не очень хорошая идея, и нужно избегать, насколько это возможно.Предполагая, что в вашей конкретной ситуации это обязательно по тем или иным причинам, с точки зрения чистой ОО, я бы подошел следующим образом:

a) Определите глобальную переменную в одном файле, например a.cpp (такжеесли переменная может быть встроена в пространство имен)

b) Записать функции get / set в a.cpp

c) Получить доступ к глобальной переменной в a.cpp с помощью функций get / set.

Таким образом, у вас будет очень модульная конструкция с четко определенным интерфейсом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...