2011-11-11 99 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