[英]C++ include guards and multiple definition errors
我有一種情況需要在2個.cpp文件中包含頭文件(stack.h)。
設置如下:
//------"stack.h"------//
std::stack<int> s;
int a;
void doStackOps();
void print();
//------"stack.cpp"------//
#include "stack.h"
//------"main.cpp"------//
#include "stack.h"
我的頭文件包含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)
為了解決這個問題,答案建議在這里出現類似的情況為什么我的包含警衛不能防止遞歸包含和多個符號定義? 是我們使用的
inline or static
內聯是首選
由於我只得到變量的錯誤,當我重新定義堆棧時錯誤消失:
static std::stack<int> s;
static int a;
關於這里可能發生什么的任何想法? 如果有幫助,我正在使用Xcode 6.非常感謝任何幫助!
提前致謝。
有多個定義錯誤,因為stack.cpp會:
stack<int> s;
和main.cpp也定義了一個堆棧:
stack<int> s;
您有兩個使用相同名稱定義的不同全局對象會導致未定義的行為(幸運的是,您的鏈接器會對其進行診斷)。
相反,您可能要做的是擁有一個由多個不同單元引用的單個堆棧。 要實現這一點,您只能使用定義堆棧的行出現一次。 (請記住, #include
只是一個直接的文本替換;您的代碼行為與將stack.h
的內容復制粘貼到每個.cpp
文件的主體中的行為相同)。
其他單元需要有一行說“有一個stack<int>
被稱為s
定義在某處(但不是在這里)”,其代碼是:
extern stack<int> s;
所以你應該把那一行放在你的頭文件中,並把stack<int> s;
在一個.cpp文件中 - 無關緊要。
對於函數,您不在頭文件中定義任何函數,只聲明。 如果您在標題中定義了一個函數(例如void print() { }
),那么您將遇到導致未定義行為的相同多重定義錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.