Разделение кода на несколько файлов - PullRequest
3 голосов
/ 01 августа 2011

Я знаю, что раньше об этом спрашивали миллиард раз, но у меня все еще проблемы.

Я начал с одного main.cpp файла, который содержал весь мой код.Скажем, это выглядело так:

int a = 0;
void foo() {
    a+1;
}

void bar() {
    a+2;
}

int main() {
    foo();
    bar();
    a + 3;
}

Теперь я хочу разделить этот код на несколько файлов для более удобного управления.Я хотел бы иметь только один заголовок, header.h и три .cpp файла: main.cpp, foo.cpp и bar.cpp.

ATM, вот что у меня есть:

//header.h
int a = 0;
void foo();
void bar();

.

//foo.cpp
#include "header.h"
void foo() {a+1;}

.

//bar.cpp
#include "header.h"
void bar() {a+2;}

.

//main.cpp
#include "header.h"
int main() {
    foo();
    bar();
    a + 3;
}

К сожалению, компоновщик жаловался, что я определил a многократно.Я пытался использовать #ifdef, но это только защищает от переопределения в том же файле, правильно?Как я могу сделать эту работу?

РЕДАКТИРОВАТЬ: изменил вопрос, я только что понял, что это переменные, которые были определены несколько раз, а не функции.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Я думаю, что большая проблема в том, что вы реализуете что-то в заголовочном файле .Проблема в том, что когда вы включаете заголовок в несколько объектных файлов, вы столкнетесь с проблемой во время компоновщика.Не делайте этого.

Используйте определение для такого рода вещей.Разница в том, что define, будучи макросом препроцессора, не создает сам объектный код и не создает никаких символов.Существуют преимущества объявления некоторого типа const вместо define, но я думаю, что не нужно беспокоиться о коллизиях символов во время соединения.

Ваш заголовочный файл нуждается включая охранников , а также

0 голосов
/ 01 августа 2011
//header.h
void foo();
void bar();

должно быть

extern void foo();
extern void bar();
...