У меня есть ситуация, когда мне нужно включить файл заголовка (stack.h) в 2 файла .cpp.
Настройка выглядит следующим образом:
//------"stack.h"------//
std::stack<int> s;
int a;
void doStackOps();
void print();
//------"stack.cpp"------//
#include "stack.h"
//------"main.cpp"------//
#include "stack.h"
Вопрос 1
Мой заголовочный файл содержит 2 переменные и 2 метода. Кажется, я получаю несколько ошибок определения только для переменных, почему это так? Не следует ли также жаловаться на переопределение функций?
Ошибка выглядит так:
duplicate symbol _stacks in:
/Users/.....stack.o
/Users/......main.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
вопрос 2
Чтобы решить эту проблему, ответ, предложенный для аналогичной ситуации, здесь -symbol/28652792#28652792">Почему моя защита включения не предотвращает рекурсивное включение и множественные определения символов? это то, что мы используем
inline or static
где предпочтительнее встроенный
- Почему встроенный предпочтительнее статического?
- inline может использоваться только с функциями?
Поскольку я получаю ошибку только в переменной, ошибка исчезает, когда я переопределяю стек как:
static std::stack<int> s;
static int a;
Любые идеи о том, что может происходить здесь? Если это поможет, я использую Xcode 6. Буду очень признателен за любую помощь!
Заранее спасибо.
static
? (когда вне функции или класса) - person user253751   schedule 23.02.2015