我在使用一個extern宣告的全域物件時遇到了麻煩。根據我的理解,我應該能夠在頭檔案中宣告一個物件為extern,在源檔案中定義它,然后在包含頭檔案的任何其他源檔案中使用該物件。然而,在下面的結構中,我得到一個聯結器錯誤,說logger符號是未定義的。
logger.hpp:
#ifndef MY_LOGGER_H
#define MY_LOGGER_H
namespace foo {
class Logger {
public:
void log(int num)。
};
extern Logger記錄器。
} // foo
#endif
logger.cpp:
#include "logger.hpp"/span>
using namespace foo;
void Logger:: log(int num){ /* Do stuff */ }
Logger記錄器。
main.cpp:
#include "logger.hpp"/span>
using namespace foo;
int main() {
logger.log(3); //任意數字。
}
如果我在main()中宣告一個Logger,一切正常,所以頭檔案和源檔案被正確地包含和鏈接。
我在使用內置型別(例如:int)時也得到了同樣的錯誤,所以我認為這也不是Logger類本身的問題。
如果這是個愚蠢的問題,我有幾年的C 經驗,但直到現在我還像躲避瘟疫一樣躲避全域變數。
uj5u.com熱心網友回復:
這個宣告
Logger logger。
在全域命名空間中定義一個變數。
你需要用限定的名稱來寫
#include "logger.hpp"/span>
using namespace foo;
void Logger:: log(int num){ /* Do stuff */ }
Logger foo::logger。
來自C 20標準(9.8.1.2命名空間成員定義)
2 命名空間的成員也可以通過明確的限定在該命名空間之外被定義。 命名空間的成員也可以通過被定義的名稱的明確限定(6.5.3.2)在該命名空間之外定義。 的成員也可以通過對被定義的名稱進行明確的限定(6.5.3.2)而在該名稱空間之外進行定義,條件是被定義的物體已經在該名稱空間中被宣告,并且該定義出現在 的物體已經在命名空間中宣告,并且該定義出現在宣告點之后。 命名空間中,并且定義出現在包圍著該宣告的命名空間之后。下面是一個示范程式。
#include <iostream>
namespace foo {
class Logger {
public:
void log(int num)。
};
extern Logger記錄器。
} // foo
using namespace foo;
void Logger:: log(int num){ /* Do stuff */ }
Logger foo::logger;
int main()
{
logger.log(3)。
return 0;
uj5u.com熱心網友回復:
你需要把定義放在logger.cpp中的foo命名空間:
#include "logger.hpp"/span>
namespace foo { // not "using namespace foo"
void Logger:: log(int num){ /* Do stuff */ }
Logger logger; //這就是你在logger.hpp中宣告的 "foo::Logger"。
} //namespace foo。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329622.html
標籤:
上一篇:在C 向量中高效交換元素
