C++ C++;:gcc可以';链接时找不到静态成员

C++ C++;:gcc可以';链接时找不到静态成员,c++,gcc,linker,C++,Gcc,Linker,我得到一个错误: file.cpp:20: undefined reference to `MyClass::arr' 在这一行,我有: #include "MyClass.hpp" extern "C" { void MyClass::func() { arr = 0; } 在标题处: class MyClass { public: static int arr; static void func(); } 调用p.S.gcc(4.x)时使用:-Xlinke

我得到一个错误:

file.cpp:20: undefined reference to `MyClass::arr'
在这一行,我有:

#include "MyClass.hpp"
extern "C" {
void MyClass::func() {
 arr = 0;
}
在标题处:

class MyClass {
    public:
     static int arr;
     static void func();
}
调用p.S.gcc(4.x)时使用:
-Xlinker-zmuldefs
,以避免多重定义检查。

这毫无意义:

#include <MyClass.hpp>
extern "C" {
void MyClass::func() {
 arr = 0;
}
#包括
外部“C”{
void MyClass::func(){
arr=0;
}

#包括
int MyClass::arr=0;//需要实例化以满足链接器的要求。
void MyClass::func()
{
arr=0;
}
这毫无意义:

#include <MyClass.hpp>
extern "C" {
void MyClass::func() {
 arr = 0;
}
#包括
外部“C”{
void MyClass::func(){
arr=0;
}

#包括
int MyClass::arr=0;//需要实例化以满足链接器的要求。
void MyClass::func()
{
arr=0;
}
实现

#include "MyClass.hpp"

 void MyClass::func()
 {
     this->arr = 0;
 }
头文件

class MyClass 
{
public:
    static int arr;
    static void func();
}
实施

#include "MyClass.hpp"

 void MyClass::func()
 {
     this->arr = 0;
 }
头文件

class MyClass 
{
public:
    static int arr;
    static void func();
}

class
语句中声明静态类字段后,还必须在单个
.cpp
文件中定义。在该文件中,您应该放置:

int MyClass::arr;

顺便说一下,
#include
语句只有在包含系统头时才有
括号;对于您自己的头,您应该使用常用的双引号(

int MyClass::arr;

顺便说一句,
#include
语句只有在包含系统头时才有
括号;对于您自己的头,您应该使用常用的双引号(
)。

+1--但是
外部的“C”
可能是将
func
用作pthreads回调函数所必需的。@Billy编译器应该如何使MyClass::func外部为“C”如果C中不存在这样的东西?@Tomek:我的理解虽然有限,但它不能。严格来说,为了便于移植,线程函数不能是成员函数。但在很多平台上这并不重要,因为外部“C”调用约定与这些计算机上的静态调用约定相匹配。+1--但是使用
func
作为pthreads回调函数可能需要
extern“C”
。@Billy编译器应该如何使MyClass::func extern“C”呢如果C中不存在这样的东西?@Tomek:我的理解虽然有限,但它不能。严格来说,为了便于移植,线程函数不能是成员函数。但在很多平台上这并不重要,因为外部“C”调用约定与这些计算机上的静态调用约定相匹配。为什么
#include
而不是
#include“MyClass.hpp”
?通常
s
表示库包含。啊,我的错。清除了这个示例。@David:
外部“C”
也可以更改调用约定(例如,如果在MSVC++上将默认设置为
\uu stdcall
extern“C”
将确保使用
\uu cdecl
)@比利:我刚写完评论就意识到了这一点,所以我在看到你的评论之前就删除了它。你是对的,因为它确实对通话约定有影响。接下来要为我检查的是,如果没有
extern“C”来声明它是否可以接受(我的直觉是不可以)
并用它定义它——只看到声明的翻译单元将无法访问调用约定,那里的代码将尝试用错误的约定调用函数。为什么
#include
而不是
#include“MyClass.hpp”
?通常
s
表示库包含.Argh,我的不好。清除了该示例。@David:
extern“C”
也可以更改调用约定(例如,如果在MSVC++上将默认设置为
\u stdcall
extern“C”
将确保使用
\u cdecl
)@比利:我刚写完评论就意识到了这一点,所以我在看到你的评论之前就删除了它。你是对的,因为它确实对通话约定有影响。接下来要为我检查的是,如果没有
extern“C”来声明它是否可以接受(我的直觉是不可以)
并用它定义调用约定——只有看到声明的转换单元将无法访问调用约定,那里的代码将尝试使用错误的约定调用函数。您需要
extern“C”
在那里从pthreads进行调用。您需要
extern“C”
在那里从pthreads进行调用。