C和C++混合编程(__cplusplus使用)
来源:互联网 发布:零基础学算法豆瓣 编辑:程序博客网 时间:2024/05/06 16:41
第一种理解
比如说你用C++开发了一个DLL库,为了能够让C语言也能够调用你的DLL输出(Export)的函数,你需要用extern"C"来强制编译器不要修改你的
函数名。
通常,在C语言的头文件中经常可以看到类似下面这种形式的代码:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#endif
那么,这种写法什么用呢?实际上,这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式,是因为两种语言之间的一些差
异所导致的。由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在
编译的时候,CPP编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,CPP编译器可以直接根据目标文件中的符号名
将多个目标文件连接成一个目标文件或者可执行文件。但是在C语言中,由于完全没有多态性的概念,C编译器在编译时除了会在函数名前面添
加一个下划线之外,什么也不会做(至少很多编译器都是这样干的)。由于这种的原因,当采用CPP与C混合编程的时候,就可能会出问题。假
设在某一个头文件中定义了这样一个函数:
int foo(int a, int b);
而这个函数的实现位于一个.c文件中,同时,在.cpp文件中调用了这个函数。那么,当CPP编译器编译这个函数的时候,就有可能会把这个函数
名改成_fooii,这里的ii表示函数的第一参数和第二参数都是整型。而C编译器却有可能将这个函数名编译成_foo。也就是说,在CPP编译器得
到的目标文件中,foo()函数是由_fooii符号来引用的,而在C编译器生成的目标文件中,foo()函数是由_foo指代的。但连接器工作的时候,它
可不管上层采用的是什么语言,它只认目标文件中的符号。于是,连接器将会发现在.cpp中调用了foo()函数,但是在其它的目标文件中却找不
到_fooii这个符号,于是提示连接过程出错。extern "C"{}这种语法形式就是用来解决这个问题的。本文将以示例对这个问题进行说明。
首先假设有下面这样三个文件:
#ifndef __TEST_EXTERN_C_H__
#define __TEST_EXTERN_C_H__
#ifdef __cplusplus
extern "C" {
#endif
extern int ThisIsTest(int a, int b);
#ifdef __cplusplus
#endif
#endif
在这个头文件中只定义了一个函数,ThisIsTest()。这个函数被定义为一个外部函数,可以被包括到其它程序文件中。假设ThisIsTest()函数
的实现位于test_extern_c.c文件中:
#include "test_extern_c.h"
int ThisIsTest(int a, int b)
{
}
可以看到,ThisIsTest()函数的实现非常简单,就是将两个参数的相加结果返回而已。现在,假设要从CPP中调用ThisIsTest()函数:
#include "test_extern_c.h"
#include <stdio.h>
#include <stdlib.h>
class FOO {
};
int main(int argc, char **argv)
{
}
在这个CPP源文件中,定义了一个简单的类FOO,在其成员函数bar()中调用了ThisIsTest()函数。下面看一下如果采用gcc编译test_extern_c.c
,而采用g++编译main.cpp并与test_extern_c.o连接会发生什么情况:
[cyc@cyc src]$ gcc -c test_extern_c.c
[cyc@cyc src]$ g++ main.cpp test_extern_c.o
[cyc@cyc src]$ ./a.out 45
result=9
**************************************************************************************
在windows下,不像linux上的g++,可以输入a.out 参数1 参数2....
在vc里该怎么操作呢?
int main(int argc,char*argv[])
如果你直接运行的时候,默认的argc是为1,而argv[0]=该.exe文件的物理地址,这个你可以设置断点跟进去看
如果你想要多个参数,你可以在命令项下运行:举个例子:
int main(int argc,char*argv[])
{
}
假如说你生成的文件在c:\下的123.exe;
那么你在命令行下输入c:\123 aaaa bbbb cccc
那么程序最终会输出 c:\123.exe
这4个字符串<这几个都是命令行传给main函数的>
如果你编译之后直接点运行那么就只会输出 c:\123.exe
还比如这个 NOTEPAD 123.txt 运行以后就会打开123.txt文件
他们都是一个道理
看过多个Linux下的软件的源代码,发现很多项目都有main(int argc,char *argv[])或者 ( intargc,char **argv ),
在网上找到如下的说明。
其实: int main(int argc,char *argv[]) 是 UNIX 和 Linux 中的标准写法,而 intmain() 只是 UNIX 及 Linux 默许的用法..
那究竟 argc,argv[] 有何之用呢?下面看个例子 test_argc.c 就会明白它们的用法了:
#include<unistd.h>
#include<stdio.h>
int main(int argc,char *argv[])
{