几天前,我遇到了这段 C++ 代码,虽然我不能贴出代码本身,但我可以用一些示例代码重现问题。 首先是文件 namespace.h:
#include <iostream>
using namespace std;
namespace useless{
class X {
int m_myint;
static X *m_foobar;
X* getPrivVal(void);
public:
int getMember(void);
X* getStaticVal(void);
};
}
接下来是namespace.cpp
:
#include "namespace.h"
extern "C"{
namespace useless{
X* X::m_foobar = NULL;
X* X::getPrivVal(void){
if(m_foobar == NULL)
m_foobar = new X;
return(m_foobar);
}
}
}
namespace useless {
int X::getMember(void){
if(m_myint == 0)
m_myint = 1;
return(m_myint);
}
X* X::getStaticVal(void){
return(getPrivVal());
}
}
using namespace useless;
int main(void){
X y;
cout << "The int value is " << y.getMember() << endl;
cout << "The value of the static member is " << y.getStaticVal() << endl;
return(0);
}
当我使用g++ 3.4.3时,这段代码编译和链接都很好,但是当我使用g++ 4.x时,它会出现以下错误。我已经尝试过GCC 4.6.1和GCC 4.2.1。在Linux和Mac上都尝试过,结果相同。
这是错误信息(Suse):
g++ -o namespace namespace.cpp
namespace.h:8:15: error: previous declaration of useless::X*
useless::X::m_foobar with C++ linkage
namespace.cpp:5:11: error: conflicts with new declaration with C linkage
请问有谁能解释一下这个传统的C++代码想要做什么,这可能是一个黑客或绕过我不再了解的老问题的解决方法。哦,顺便说一句,在extern "C"
内部的方法由C++代码调用,而不是我最初怀疑的任何C代码调用。
提醒您,这是遗留代码,可能是在2001/2002年编写的。
谢谢大家。我已经去掉了extern "C",没有太大的影响。 @Bjorn Pollex: 编写该代码的人早已离开。