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
原创粉丝点击