Mix C Cpp:修订间差异

来自Ubuntu中文
跳到导航跳到搜索
Dbzhang800留言 | 贡献
Dbzhang800留言 | 贡献
无编辑摘要
 
第7行: 第7行:
下面是 C++ 程序调用 C 函数 csayhello() 的一个例子。由于该函数在 C++ 程序内声明时使用了 extern "C",故调用可以直接进行:
下面是 C++ 程序调用 C 函数 csayhello() 的一个例子。由于该函数在 C++ 程序内声明时使用了 extern "C",故调用可以直接进行:


    /* cpp2c.cpp */
<source lang="c">
    #include <iostream>
/* cpp2c.cpp */
    extern "C" void csayhello(char *str);
#include <iostream>
    int main(int argc,char *argv[])
extern "C" void csayhello(char *str);
    {
int main(int argc,char *argv[])
          csayhello("Hello from cpp to c");
{
          return(0);
    csayhello("Hello from cpp to c");
    }
    return(0);
                                                                                                                                                                                                                                C 函数不需任何特殊处理,其代码如下:
}
</source>


    /* csayhello.c */
C 函数不需任何特殊处理,其代码如下:
    #include <stdio.h>
 
    void csayhello(char *str)
<source lang="c">
    {
/* csayhello.c */
          printf("%s\n",str);
#include <stdio.h>
    }
void csayhello(char *str)
{
    printf("%s\n",str);
}
</source>


下面三条命令编译以上两个文件并将二者链接为一个可执行文件。由于 gcc 和 g++ 的灵活性使得存在很多方法来完成该任务,但这三条命令或许是最常用的:
下面三条命令编译以上两个文件并将二者链接为一个可执行文件。由于 gcc 和 g++ 的灵活性使得存在很多方法来完成该任务,但这三条命令或许是最常用的:
    $ g++ -c cpp2c.cpp -o cpp2c.o
$ g++ -c cpp2c.cpp -o cpp2c.o
    $ gcc -c csayhello.c -o csayhello.o
$ gcc -c csayhello.c -o csayhello.o
    $ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c


注意到,在最后链接的时候指定 C++ 标准库是必须的,这是因为我们用的是 gcc 而不是 g++ 调用的链接器。如果使用的是 g++ 的话,C++ 标准库默认会被链接。
注意到,在最后链接的时候指定 C++ 标准库是必须的,这是因为我们用的是 gcc 而不是 g++ 调用的链接器。如果使用的是 g++ 的话,C++ 标准库默认会被链接。


最普遍的做法是,将函数声明放到头文件中,然后将所有内容包含在 extern "C" 声明块内。文件内容像下面所示:
最普遍的做法是,将函数声明放到头文件中,然后将所有内容包含在 extern "C" 声明块内。文件内容像下面所示:
    extern "C" {
<source lang="c">
          int mlimitav(int lowend, int highend);
extern "C" {
          void updatedesc(char *newdesc);
    int mlimitav(int lowend, int highend);
          double getpct(char *name);
    void updatedesc(char *newdesc);
    };
    double getpct(char *name);
};
</source>


==C调用C++函数==
==C调用C++函数==


要使 C 程序能够调用 C++ 中函数的话,C++ 提供一个符合 C 调用惯例的函数是必须的。下面的例子演示了在 C++ 内创建 C 函数的语法:
要使 C 程序能够调用 C++ 中函数的话,C++ 提供一个符合 C 调用惯例的函数是必须的。下面的例子演示了在 C++ 内创建 C 函数的语法:
    /* cppsayhello.cpp */
<source lang="c">
    #include <iostream>
/* cppsayhello.cpp */
    extern "C" void cppsayhello(char *str);
#include <iostream>
    void cppsayhello(char *str)
extern "C" void cppsayhello(char *str);
    {
void cppsayhello(char *str)
        std::cout << str << "\n";
{
    }
    std::cout << str << "\n";
}
</source>


尽管函数 cppsayhello() 通过 extern "C" 声明为 C 函数,事实上它是 C++ 源代码的一部分,这意味着函数体内是真正的 C++ 代码。在函数内你可以自由地创建和析构对象。如果你要在 cppsayhello() 内调用 C 函数的话,将其声明为 extern    "C" 是必须的。否则,编译器会将作为一个 C++ 函数并相应地更改函数名。
尽管函数 cppsayhello() 通过 extern "C" 声明为 C 函数,事实上它是 C++ 源代码的一部分,这意味着函数体内是真正的 C++ 代码。在函数内你可以自由地创建和析构对象。如果你要在 cppsayhello() 内调用 C 函数的话,将其声明为 extern    "C" 是必须的。否则,编译器会将作为一个 C++ 函数并相应地更改函数名。


下面是调用 C++ 函数 cppsayhello() 的 C 程序:
下面是调用 C++ 函数 cppsayhello() 的 C 程序:
    /* c2cpp.c */
<source lang="c">
    int main(int argc,char *argv[])
/* c2cpp.c */
    {
int main(int argc,char *argv[])
        cppsayhello("Hello from C to C++");
{
        return(0);
    cppsayhello("Hello from C to C++");
    }
    return(0);
}
</source>


下面的命令编译并链接生成c2cpp:
下面的命令编译并链接生成c2cpp:
    $ g++ -c cppsayhello.cpp -o cppsayhello.o
$ g++ -c cppsayhello.cpp -o cppsayhello.o
    $ gcc -c c2cpp.c -o c2cpp.o
$ gcc -c c2cpp.c -o c2cpp.o
    $ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp
$ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp


==其他参考==
==其他参考==
{{Gccmorerefer}}
{{Gccmorerefer}}

2008年4月16日 (三) 19:18的最新版本

C与C++混合编程

C++ 是在 C 语言的基础上发展起来的。在某种程度上,我们可将 C++ 看做 C 的一种扩展。在本质上,二者的数据类型和函数调用惯例都是一致的,因此 C 与 C++ 混合编译也是很自然的事情。

二者的区别仅在于编译后函数的名字不同──C 简单地使用函数名而不考虑参数的个数或类型,而 C++ 编译后的函数名则总是将参数类型列表作为其一部分。尽管如此,C++ 提供了特殊的机制来声明 C 函数,这意味着一个 C++ 程序可以直接声明和调用 C 函数。

C++调用C函数

下面是 C++ 程序调用 C 函数 csayhello() 的一个例子。由于该函数在 C++ 程序内声明时使用了 extern "C",故调用可以直接进行:

<source lang="c"> /* cpp2c.cpp */

  1. include <iostream>

extern "C" void csayhello(char *str); int main(int argc,char *argv[]) {

   csayhello("Hello from cpp to c");
   return(0);

} </source>

C 函数不需任何特殊处理,其代码如下:

<source lang="c"> /* csayhello.c */

  1. include <stdio.h>

void csayhello(char *str) {

   printf("%s\n",str);

} </source>

下面三条命令编译以上两个文件并将二者链接为一个可执行文件。由于 gcc 和 g++ 的灵活性使得存在很多方法来完成该任务,但这三条命令或许是最常用的:

$ g++ -c cpp2c.cpp -o cpp2c.o
$ gcc -c csayhello.c -o csayhello.o
$ gcc cpp2c.o csayhello.o -lstdc++ -o cpp2c

注意到,在最后链接的时候指定 C++ 标准库是必须的,这是因为我们用的是 gcc 而不是 g++ 调用的链接器。如果使用的是 g++ 的话,C++ 标准库默认会被链接。

最普遍的做法是,将函数声明放到头文件中,然后将所有内容包含在 extern "C" 声明块内。文件内容像下面所示: <source lang="c"> extern "C" {

   int mlimitav(int lowend, int highend);
   void updatedesc(char *newdesc);
   double getpct(char *name);

}; </source>

C调用C++函数

要使 C 程序能够调用 C++ 中函数的话,C++ 提供一个符合 C 调用惯例的函数是必须的。下面的例子演示了在 C++ 内创建 C 函数的语法: <source lang="c"> /* cppsayhello.cpp */

  1. include <iostream>

extern "C" void cppsayhello(char *str); void cppsayhello(char *str) {

   std::cout << str << "\n";

} </source>

尽管函数 cppsayhello() 通过 extern "C" 声明为 C 函数,事实上它是 C++ 源代码的一部分,这意味着函数体内是真正的 C++ 代码。在函数内你可以自由地创建和析构对象。如果你要在 cppsayhello() 内调用 C 函数的话,将其声明为 extern "C" 是必须的。否则,编译器会将作为一个 C++ 函数并相应地更改函数名。

下面是调用 C++ 函数 cppsayhello() 的 C 程序: <source lang="c"> /* c2cpp.c */ int main(int argc,char *argv[]) {

   cppsayhello("Hello from C to C++");
   return(0);

} </source>

下面的命令编译并链接生成c2cpp:

$ g++ -c cppsayhello.cpp -o cppsayhello.o
$ gcc -c c2cpp.c -o c2cpp.o
$ gcc cppsayhello.o c2cpp.o -lstdc++ -o c2cpp

其他参考