2011-11-11 98 views
1

你知道爲什麼下面的代碼無法編譯?命名空間內的extern「C」

#include <iostream> 

namespace C { 
    extern "C" { 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> // open() 
#include <unistd.h> // read() 
    } 
} 

int main(int argc, char** argv) { 
    int fd = C::open("./main.cpp", O_RDONLY); 
    C::read(fd, 0, 0); 
    return 0; 
} 

錯誤從GCC 4.4編譯器:

error: ‘read’ is not a member of ‘C’ 
+1

我不明白你的問題。爲什麼不包括unistd.h? – nmagerko

+0

@JerryCoffin:爲什麼它不會鏈接? –

+0

@Jerry:參見7.5.6:「最多一個具有特定名稱的函數可以具有C語言鏈接。具有相同函數名稱的C語言鏈接的函數 的兩個聲明(忽略限定它的名稱空間名稱) 出現在不同的命名空間範圍中引用同一個函數。對於具有C語言的對象的兩個聲明 命名空間作用域中出現在不同 命名空間作用域中的名稱相同(忽略限定它的命名空間名稱)引用同一個對象。 –

回答

5

你不能注入一切都變成一個標題下一個命名空間。在這種情況下,read是一個宏,它在名稱空間解析規則生效之前會被評估爲其他內容。

+0

好的,對,我應該想到這一點。 – Martin

+0

但是等一下。必須是與此不同的東西。爲什麼如果我刪除#include 該程序編譯並鏈接到C :: open()和C :: read()? – Martin