[英]C++ extern keyword and global variables
我有兩個名為file_utils.h和file_utils.cpp的文件,它們包含一些由不同類使用的方法和變量。 以下是它的外觀示例:
file_utils.h:
namespace my_namespace
{
extern Foo* foo;
extern Bar* bar;
void my_function(Blah* blah);
}
file_utils.cpp
#include "file_utils.h"
void my_namespace::my_function(Blah* blah)
{
foo = 0; // undefined reference to my_namespace::foo
bar = 0; // undefined reference to my_namespace::bar
//...
}
some_class.cpp
#include "file_utils.h"
some_function()
{
my_namespace::my_function(blah);
this->foo = *my_namespace::foo; // will that work ok?
}
所以錯誤在評論中。 如果我刪除extern關鍵字,我會得到multiple definition of my_namespace::foo
錯誤的multiple definition of my_namespace::foo
。 問題是什么? 從設計的角度來看,這是一個好主意,還是我應該嘗試使用靜態成員和方法的類?
問題是你只聲明但未定義變量。
您需要在單個實現文件中提供定義:
file_utils.cpp
#include "file_utils.h"
//definition:
namespace my_namespace
{
Foo* foo;
Bar* bar;
}
//alternatively, to keep the same formatting you have
//Foo* my_namespace::foo;
//Bar* my_namespace::bar;
void my_namespace::my_function(Blah* blah)
{
foo = 0;
bar = 0;
//...
}
首先,我真的建議你澄清自己兩個不同之處:
在您的情況下,您會收到鏈接器錯誤 未定義的引用意味着您的代碼指向某處,但鏈接器無法找出位置。
當您使用代碼中某處找到的對象時,extern關鍵字用於抑制編譯器錯誤。 在您的示例中,鏈接器嘗試查找類的實例但失敗。 這不常用於指針(如果我錯了,請糾正我)。 因此:
utils.h :
namespace mySpace{
extern Foo foo; // notes that foo of type Foo will be used.
void myFn();
}
utils.cpp :
#include "utils.h"
void mySpace::myFn(){
foo.bar = 5; // changes a member of foo from globals.cpp
}
globals.cpp
Foo mySpace::foo; // this is the actual foo used.
如果您想解答有關some_class.cpp的問題,請向社區提供有關conversions
和您希望實現的內容的知識。
從語義來看,我認為它是對類conversions
成員的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.