请问程序中的extern "C" 都起到了什么作用?他是在编译时起作用还是运行时起作用?
不是用它会有什么影响?

解决方案 »

  1.   

    要通知编译器一个或多个函数已经在c中编译好了,想这样写出函数原型:extern "C" 函数原型 //单个函数extern "C"          //多个函数
    {
        函数原型
    }这些声明通知了编译器指定的函数不在c++中编译,因此不对连接说明中列出的函数名编码。
      

  2.   

    各个厂家对c++的编译产生的代码中会把标示符翻译得一塌糊涂。extern "C"解决这个问题.
      

  3.   

    “编译的时候起作用。表明是以C的标准来进行堆栈的处理”以上这句话是不是说明C和C++对处理堆栈的方式有所不同?具体说来,堆栈再C和C++程序运行的时候起到什么作用?
      

  4.   

    主要用来解决编译器对函数名称的内部命名问题。
    如果声明了
       void func(int );
    在 c++中, 编译器可能把它的名字编译成
        func_int 之类的形式,用以支持重载;
    而在c中,编译器就把它的名字编译成func;所以,如果有一个现成的C的库,里面有一个void func(int );函数,C++程序
    怎样使用它呢?就要用
     extern "C" void func(int );
    来进行函数原型的声明,告诉c++编译器,别把名字改了,就叫func,
    以后的函数调用func(1),才能生成一个对func的调用。
    这样的编译模块,才能够和c库相连,而不会发生unresolved function name之类的连接错误。 这是我对 extern "C" 的理解。
      和参数的入栈顺序有关么?我不清楚,希望有高手解释。
    c
      

  5.   

    lh_lihong(黎弘)地回答让我对extern "C"有了更好的理解,非常感谢!
    >>>>>
    在 c++中, 编译器可能把它的名字编译成
        func_int 之类的形式,用以支持重载;为什么将func(int)"编译成"就可以支持重载啊?
      

  6.   

    这是一句话,为了看得清除,把它放在两行来写:即
    “在 c++中, 编译器可能把它的名字编译成func_int 之类的形式,用以支持重载;”
    意思是这样的:
      一个函数名字,本质上是什么呢?
      应该是内存中的一个地址,这个地址指向函数的执行入口;或者说是一个函数指针。
    那么,程序员所看到的函数重载形式:
       void func(int);
       void func(float);
    编译器怎样来寻找具体的函数体呢?要注意,它们对应着两个不同的函数体,也就是不同的地址,编译器为把它们区分开,只得分别为他们起不同的名字
       func_int
       func_float
    从而支持了重载。