簡體   English   中英

為什么在C ++命名空間周圍使用extern“C”

[英]Why use an extern “C” around a C++ namespace

幾天前,我遇到了這段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);
  };
}

接下來, 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期間編寫的。


多謝你們。 我已經走了,擺脫了外部“C”沒有重大影響。 @Bjorn Pollex:編寫該代碼的人早已不復存在。

extern "C"指令有兩個效果,它在可能的情況下禁用重整並使用C調用約定。 在這種特殊情況下,因為中間存在名稱空間,所以不能禁用名稱修改,因此可以添加它以強制執行特定的調用約定。

代碼實際上是錯誤的,因為聲明不強制extern "C"但定義確實如此,這是不正確的。 考慮一下,如果編譯器只是遵循如圖所示的指令,調用者將使用C ++命名和調用約定,而函數將使用C變量,如果兩者不同,結果將是未定義的行為。

似乎試圖生成沒有C ++名稱修改的變量。 這是使用extern "C"

較新的編譯器顯然意識到它確實不起作用。

如果你想從一個用另一種語言編寫的模塊(C,FORTRAN或其他)調用一段C ++代碼,你想要關閉C ++名稱修改。

編輯:真正奇怪的是他們是在定義上做的,而不是在聲明上做的。 這是一個奇跡,它曾經編譯過

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM