在《COM技术内幕》中,对GUID的声明和定义采用了这种方式://Header File: IFACE.Hextern "C"
{
   extern const IID IID_IX;
   extern const IID IID_IY;
}
//End IFACE.H
//CPP File: GUIDS.CPP
extern "C"
{
extern const IID IID_IX = 
{ 0x56c66890, 0x7c5e, 0x470d, 
{ 0x93, 0x14, 0xcf, 0x98, 0xe, 0x78, 0xd0, 0x72 }
};
extern const IID IID_IY = 
{ 0xe7ae2ab5, 0xe0cd, 0x4740, { 0x8c, 0x8d, 0x15, 0xf9, 0x9, 0x52, 0x56, 0x13 } };
};
//End Cpp请问,为什么在头文件中使用 extern "C" 声明了接口GUID后,在CPP文件定义该接口GUID时,还要加 extern "C"修饰?这是什么意思?另外在extern "C"{extern variable = {}; }中,大括号里面的“extern”起什么作用呢?
在线等答复。

解决方案 »

  1.   

    extern "C"是c 写 dll 中的一种用法 为了让c++识别 c dll大概是这样 windows程序设计
    那本书里dll部分有详细讲解。
      

  2.   

    extern const IID IID_IX 表明 iid_ix 是外部变量已经在别的文件定义过了。详见谭浩强c语言程序设计第八章
      

  3.   

    可是为什么在定义文件里又用extern修饰呢?
      

  4.   

    extern 表示这里的变量是外部定义的。
      

  5.   

    晕哦,我知道extern是声明外部变量的,我问的是在GUIDS.CPP里为什么还用extern修饰?是不是也代表声明?那么它的定义在哪里?
      

  6.   

    extern "C"是作为一个整体来用的
    而定义
     iid的 const可以单独使用
      

  7.   

    我在GUIDS.CPP里试过将extern "C" { extern const IID IID_IX = {...}} 中里面的extern去掉,编译无法通过。
    但我在其它工程里试的时候,在头文件中用extern声明一个变量,再在cpp中定义出来,即可,不必在定义时再加extern修饰啊。
    奇怪,望有人说清楚。
      

  8.   

    extern const IID IID_IX = 
    { 0x56c66890, 0x7c5e, 0x470d, 
    { 0x93, 0x14, 0xcf, 0x98, 0xe, 0x78, 0xd0, 0x72 } 这个是变量的定义。extern const IID IID_IX; 这个是变量的声明,在头文件中,其他文件使用该变量包含该头文件即可。
      

  9.   

    const 修饰的全局变量的连接性默认是文件内部连接,所以你在一个文件中定义的const 变量只在当前文件中可见,如果你要在其他文件中引用该常量的话,应该在定义时加上extern: 
      

  10.   

    我晕,大部分答非所问
    extern "C" 表示采用C的变量、函数命名方式编译C++程序;如果不加,则按照C++方式进行编译,就会进行C++方式的名称转换。
    因为这里不涉及接口部分,完全可以不用extern "C",采用extern就好了
      

  11.   

    其实,如果组件不需要注册的话,组件的头文件就可以不用extern "C",因为组件与客户程序都已经具备了IID的声明与定义,可以各自为政(前提是客户与组件使用同一个IID).但是如果COM组件要被注册的话,由于组件自己要告诉系统接口的标识符是什么,所以要导出IID.但无论组件是否注册,GUID.cpp只需使用一个static用于定义IID,在头文件中用extern "C"导出.
      

  12.   

    GUIDS.CPP中的extern "C" { extern const IID IID_IX = {...}} 是变量的定义