簡體   English   中英

C ++ extern關鍵字和全局變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM