Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在命名空间中调用静态函数时出错_C++_Linkage - Fatal编程技术网

C++ 在命名空间中调用静态函数时出错

C++ 在命名空间中调用静态函数时出错,c++,linkage,C++,Linkage,我得到以下错误: 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 x、 h x、 cpp 有人能解释原因吗?您必须在标题中

我得到以下错误:

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 x、 h x、 cpp
有人能解释原因吗?

您必须在标题中定义静态函数(在本例中,删除X.cpp中的定义),或者在main.cpp中另外定义静态函数。否则main.cpp将看不到其定义。在X.cpp中定义了另一个同名的静态函数foo。静态功能没有外部连接。它们具有内部链接,应在使用它们的编译单元中定义

因此,X.cpp有它自己定义的静态函数foo。
但是main.cpp并没有定义自己的名为foo的静态函数。它只声明它是因为包含了标题。

声明的函数的链接是内部的
静态的
,这意味着它只能从当前翻译单元引用。即使多个翻译单元看到相同的声明,每个转换单元都需要一个私有版本的函数

在您的情况下,x.cpp中定义的函数foo对其他翻译单元不可用。编译器翻译main.cpp时,会将符号注释为“缺失”,但不会抱怨。稍后,在链接阶段,链接器找不到在object main中引用的private函数foo。要解决此问题,您可以:

  • 在x.h中从
    foo
    的声明中删除
    静态
    说明符
    ,这大概是没有理由的
  • 在x.h中定义foo。请注意,这种方法会增加程序的大小,因为每个翻译单元都会制作函数的私有副本。函数应决不在标题中定义内部链接,也就是说,当它们打算在所有程序中使用时
  • 在main.cpp中定义foo。当然不是你想要的
当然,正确的解决方案是第一个。其他人被解释来说明原因


有关更多信息,请阅读。另外,请注意声明和定义之间的区别,这超出了本问题的范围。

它是静态的。也许您想让它成为
extern
(默认情况下是哪些函数)<代码>静态对于全局函数/变量,表示“没有其他源文件可以查看/使用此函数/变量”<代码>静态有很多含义,这取决于上下文,我认为您不希望在这里使用它。另请参见:
#include "x.h"

int main()
{
    X::foo();
}
namespace X
{
    static int foo();
}
#include "x.h"

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