C语言与C++编译连接的不同点(从程序中看)
来源:互联网 发布:windows 网络发现 编辑:程序博客网 时间:2024/06/08 06:32
一:先上程序
a.h
#include <stdio.h>//extern void DYNAMIC_SETUP(void);void Init(void);
a.c
#include "a.h"void Init(void){ DYNAMIC_SETUP();}
b.h
#include <stdio.h>#include <stdlib.h>typedef struct _DYNAMIC *PDYNAMIC;void SetUp(void);void FUN(PDYNAMIC pDynamic);
b.c
#include "b.h"struct _DYNAMIC{ int nA;};#define SetUp DYNAMIC_SETUPvoid SetUp(void){ printf("test-------OK\n"); PDYNAMIC pDynamic = (PDYNAMIC) malloc(sizeof(*pDynamic)); pDynamic->nA = 3; FUN(pDynamic); free(pDynamic);}void FUN( PDYNAMIC pDynamic){ printf("pDynamic->nA=%d\n", pDynamic->nA);}
main.c
#include <stdio.h>#include "a.h"int main(){ printf("into main fun.........\n"); Init(); printf("out main fun.........\n"); return 0;}
Makefile(用C++编译程序)
APP = dynamicCC = g++CFLAGS = -gSRCS = a.c b.c main.c$(APP):$(SRCS)$(CC) $(CFLAGS) $(SRCS) -o $(APP)clean:rm -rf *.o $(APP)
此时编译连接有问题:
原来是编译的时候出了问题:
将上面的用C++编译连接改为用C编译连接,只需要将Makefile改为CC=gcc,此时没有问题:
原因是:
C语言中所有的函数不能同名,而C++中函数时可以同名的,当采用上述编程方式a.h中屏蔽了extern void DYNAMIC_SETUP(void);,虽然在语法上a.c中的DYNAMIC_SETUP();没有声明,但是采用C语言编译时,此时编译器会以默认的方式确认程序中已存在DYNAMIC_SETUP函数。而C++总不会采用默认的方式,直接查看是否声明,所以就产生错误。
若将上述的a.h中屏蔽的extern void DYNAMIC_SETUP(void),打开就没有任何语法问题了,怎样编译都对。
设计模式中的收获:
1.在有些动态库中,要想复用某些函数,可以使用宏定义函数指针的方式,在其它所有动态库中,只需要#define 具体函数 宏函数指针,即可,例如a.c和b.c中的应用。
2.若要是我要将程序编译成一个动态库,给使用者仅仅提供.h文件,对于.h文件中的数据结构类型无需考虑细节时,可以在.h文件中typedef struct _DYNAMIC *PDYNAMIC;,在相应的.c文件中进行struct _DYNAMIC的实现,如b.h和b.c。
3.对于我们要提供的动态库,只需要提供.h文件,此时.c文件中的所调用的函数或数据类型,对于我们的提供者是不需要知道的,但是,若.h文件中传参的时候必须使用.c中调用的数据类型,此时的做法是在提供的.h文件中单独的声明一下例如extern signed short CDBC_C_CHAR;,让其编译通过就行。而在.c文件中进行转换例如SQLSMALLINT CDBC_C_CHAR = SQL_C_CHAR;SQL_C_CHAR是我.c中实现所需要的调用动态库中的类型。
0 0
- C语言与C++编译连接的不同点(从程序中看)
- C语言与c++的不同点
- 从OOP的角度重看C++(四)——从程序中看OOP
- Java与C的不同点
- [C++] C 与 C++的一些不同点
- 【C#】与C及OC的不同点
- C与C++的相同点与不同点
- 重温C语言 - 编译连接与函数
- 总结: Java与C的不同点
- C与C++语法的不同点
- C#与C及OC的不同点
- C #与C++的相同点和不同点
- c程序的预处理,编译,连接过程。
- c程序的编译 汇编.连接过程
- C语言 函数与手动编译执行C程序
- sql语言与c语言的连接
- iOS_02_第一个C语言程序(理解编译、连接、运行)
- c语言程序的编译过程
- 5 个 iOS 和 Android 最佳的开源自动化工具
- 区块链开发(四)区块链技术详解PPT
- 文本数据的机器学习自动分类方法(上)
- lite-server工具使用
- EditText的富媒体开发(Edittext显示网络图片) 一
- C语言与C++编译连接的不同点(从程序中看)
- 串口打印设置
- ListView不同type加载数据
- OkHttp3简单使用说明
- Sql基础语句3
- 蓝图职业规划
- supervise系统进程监控
- 使用ngrok工具映射本地项目到外网地址
- UIGraphicsGetCurrentContext 和CGBitmapContextCreate 使用CGContextAddArc的奇怪处