几天前,我遇到了这段C++代码,虽然我无法粘贴代码本身,但我可以用一些示例代码重新创建问题.首先,文件命名空间:
#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);
};
}
Run Code Online (Sandbox Code Playgroud)
接下来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);
}
Run Code Online (Sandbox Code Playgroud)
当我使用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
Run Code Online (Sandbox Code Playgroud)
有人可以了解一下遗留的C++代码要做什么,这可能是一个黑客或解决方法来解决我不知道的旧问题.哦顺便说一句,里面的方法extern "C"是由C++代码调用的,而不是我最初怀疑的任何C代码.仅供参考,这是遗留代码,可能是在2001/2002期间编写的.
多谢你们.我已经走了,摆脱了外部"C"没有重大影响.@Bjorn Pollex:编写该代码的人早已不复存在.
Dav*_*eas 14
该extern "C"指令有两个效果,它在可能的情况下禁用重整并使用C调用约定.在这种特殊情况下,因为中间存在名称空间,所以不能禁用名称修改,因此可以添加它以强制执行特定的调用约定.
代码实际上是错误的,因为声明不会强制,extern "C"但定义会这样做,这是不正确的.考虑一下,如果编译器只是遵循如图所示的指令,调用者将使用C++命名和调用约定,而函数将使用C变量,如果两者不同,结果将是未定义的行为.