[英]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
在構建以下代碼時:
#include "x.h"
int main()
{
X::foo();
}
namespace X
{
static int foo();
}
#include "x.h"
namespace X
{
int foo()
{
return 1;
}
}
誰能解釋一下原因?
聲明為static
的函數的鏈接是內部的,這意味着它只能從當前的轉換單元引用。 即使多個翻譯單元看到相同的聲明,也希望每個翻譯單元的私有版本。
在您的情況下發生的是, x.cpp中定義的函數foo不可用於其他轉換單元。 當編譯器翻譯main.cpp時 ,它會將符號注釋為“缺失”,但不會抱怨。 稍后,在鏈接階段,鏈接器無法找到對象main中引用的私有函數foo 。 要解決這個問題,您可以:
foo
聲明中刪除static
說明符 ,因為沒有理由在那里。 當然,正確的解決方案是第一個。 其他人被解釋說明原因。
有關更多信息,請閱讀此頁面 。 另外,請注意聲明和定義之間的區別,這超出了本問題的范圍。
您必須在標頭中定義靜態函數(在這種情況下,在X.cpp中刪除其定義)或者另外在main.cpp中定義靜態函數。 否則main.cpp將無法看到它的定義。 在X.cpp中,定義了另一個具有相同名稱的靜態函數foo。 靜態函數沒有外部鏈接。 它們具有內部聯系,應在使用它們的編譯單元中定義。
所以X.cpp有自己定義的靜態函數foo。 但是main.cpp沒有使用名稱foo定義自己的靜態函數。 它只是由於包含標題而聲明它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.