簡體   English   中英

在命名空間中調用靜態函數時出錯

[英]Error in calling a static function in a namespace

我收到以下錯誤:

x.h:3:13: warning: ‘int X::foo()’ used but never defined
/tmp/ccK9qSnq.o: In function `main': main.cpp:(.text+0x7): undefined reference to `X::foo()'
collect2: error: ld returned 1 exit status

在構建以下代碼時:

main.cpp中

#include "x.h"

int main()
{
    X::foo();
}

XH

namespace X
{
    static int foo();
}

x.cpp

#include "x.h"

namespace X
{
    int foo()
    {
        return 1;
    }
}

誰能解釋一下原因?

聲明為static的函數的鏈接是內部的,這意味着它只能從當前的轉換單元引用。 即使多個翻譯單元看到相同的聲明,也希望每個翻譯單元的私有版本。

在您的情況下發生的是, x.cpp中定義的函數foo不可用於其他轉換單元。 當編譯器翻譯main.cpp時 ,它會將符號注釋為“缺失”,但不會抱怨。 稍后,在鏈接階段,鏈接器無法找到對象main中引用的私有函數foo 要解決這個問題,您可以:

  • xh中的 foo聲明中刪除static說明符 ,因為沒有理由在那里。
  • xh中定義foo 請注意,此方法將增加程序的大小,因為將為每個翻譯單元創建該函數的私有副本。 永遠不要在標題中使用內部鏈接定義函數,也就是說,當它們打算在所有程序中使用時。
  • main.cpp中定義foo 肯定不是你的意圖。

當然,正確的解決方案是第一個。 其他人被解釋說明原因。

有關更多信息,請閱讀此頁面 另外,請注意聲明定義之間的區別,這超出了本問題的范圍。

您必須在標頭中定義靜態函數(在這種情況下,在X.cpp中刪除其定義)或者另外在main.cpp中定義靜態函數。 否則main.cpp將無法看到它的定義。 在X.cpp中,定義了另一個具有相同名稱的靜態函數foo。 靜態函數沒有外部鏈接。 它們具有內部聯系,應在使用它們的編譯單元中定義。

所以X.cpp有自己定義的靜態函數foo。 但是main.cpp沒有使用名稱foo定義自己的靜態函數。 它只是由於包含標題而聲明它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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