博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件
阅读量:6215 次
发布时间:2019-06-21

本文共 2394 字,大约阅读时间需要 7 分钟。

  C/C++语言中,如何在main.cpp中调用另一个.c文件主要有5种思路:

  1、在VS2012 IDE中,将被引用的.c文件后缀名全部修改为.h,然后通过IDE的解决方案资源管理器中鼠标右键单击“头文件”-"添加"-“现有项”,选中修改后缀名后的.h文件-"添加",将待引用的文件添加到工程中。

  添加到“头文件”而不是“源文件”的作用:主要是使头文件的项类型属性为“C/C++ 标头”,而不是“C/C++ 编译器”。后者是将该文件独立编译成目标文件*.obj。用户可右键单击某个.h文件-属性-配置属性-常规-项类型,来查看。

  接着在main.cpp文件中,包含所需要使用头文件:

#include "13lman.h"

  然后在需要的地方,直接调用该函数即可,如下:

js=lman(3,1,200,f,q,r,h,y,x,p,g);

  2、不用修改文件扩展名,直接将待引用的.c文件添加到“源文件”下面,按照1的步骤将待引用的文件的"项类型“修改为“C/C++ 标头”。该方法的本质是将*.c文件当做*.h使用。如下图所示:

  

  接着在main.cpp文件中,包含所需要使用.c文件:

#include "13lman.c"

  然后在需要的地方,直接调用该函数即可,如下:

js=lman(3,1,200,f,q,r,h,y,x,p,g);

   3、首先,在IDE中右键选中头文件-添加-新建项-Visual C++-头文件(.h)-输入文件名,创建新的.h文件。如下图所示:

  接着,在function.h文件来声明这些待调用的函数:

#ifndef __FUNCTION_H__#define __FUNCTION_H__  int rinv(double a[],int n);   int lman(int n,int m,int k,double f[],double q[],double r[],double h[],double y[],double x[],double p[],double g[]);#endif

  然后,按照2中的步骤,将待引用的.c文件添加到源文件节点下面。将其项类型设置为“C/C++ 编译器”,预编译头设置为“不使用预编译头”。如下图所示:

  接下来,在待引用的.c文件中包含function.h头文件(貌似这一步不用也可以编译-链接-运行成功???):

#include "function.h"

  紧接着,在主调用文件main.cpp中,文件中包含待引用的.c文件:

#include "13lman.c"

  最后,在需要的直接调用该函数即可,如下:

js=lman(3,1,200,f,q,r,h,y,x,p,g);

  4、如果main.cpp需要调用的.c文件还需要依赖其它.c文件,则可以按照下图所示的方法设置各个文件的编译属性:

  前提是:所有的.c文件添加到“源文件”节点下面,将其项类型设置为“C/C++ 编译器”,预编译头设置为“不使用预编译头”(除了最后一个.c文件)。

  接着,在主调用文件main.cpp中,文件中包含待引用的.c文件:

#include "13lman.c"

  然后,在13lman.c文件中包含所依赖的4rinv.c文件:

#include "4rinv.c"

  最后,在需要的直接调用该函数即可,如下:

js=lman(3,1,200,f,q,r,h,y,x,p,g);

  5、 所有的.c文件添加到“源文件”节点下面,将其项类型设置为“C/C++ 编译器”,预编译头设置为“不使用预编译头”。如果直接编译-链接会输出“error LNK2019: 无法解析的外部符号”链接错误。

  问题原因:C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,例如C编译器会生成 _readRegmark 这个函数名,而C++编译器则生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)这么个函数名。当你的函数是用C语言写的,VS编译器会按C语言规则编译,但链接器却不知道还傻傻的用C++规则的函数名去找,当然就找不到了。

  解决办法:在C语言的头文件或主动调用的main.cpp文件的最开始部分加入如下代码:

#ifdef __cplusplusextern "C" {#endif    void readRegmark(char *regmark);  //这里写函数声明#ifdef __cplusplus}#endif

  或者,更简洁一些:

extern "C" {    int lman(int n,int m,int k,double f[],double q[],double r[],double h[],double y[],double x[],double p[],double g[]);}

  这样的话就可以编译-链接成功了。上面的解决办法适用于待调用的.c文件中的函数还依赖于其他文件中的其它函数的情况。如果主动调用文件main.cpp还需要使用其它.c文件的函数,也可以用同样的方法解决。推荐使用第一种方法。因为第一种方法既能够让.cpp文件能够包含这个.c文件,又能让其它.c文件能够包含这个.c文件。需要注意的是:__cplusplus是C++编译器内置的宏。

  对OpenGL比较熟悉的用户可能会发现在OpenGL的头文件GL.h中的开头和结尾部分就使用了上面的用法,如下图所示:

                                                                          开头部分                                                                                         结尾部分

                                                                                                         

 

 

参考链接:

1、、、

2、

3、

4、

5、

6、

7、

8、

转载地址:http://hqoja.baihongyu.com/

你可能感兴趣的文章
java实现动态代理切面编程
查看>>
ros自定义消息
查看>>
Python编码问题整理
查看>>
TranslateAnimation详解
查看>>
TP5 未定义数组索引如何解决
查看>>
android ListView下拉刷新之功能实现
查看>>
开始学习 ubuntu 14.04 各种安装各种坑
查看>>
Java后台使用Websocket教程
查看>>
go语言学习--string、int、int64互相转换,字符串的截取,数组和字符串的转换
查看>>
Linux下添加新硬盘,分区及挂载
查看>>
js复选框全选反选
查看>>
JAVA 关键字及其作用解释
查看>>
hibernate中的addEntity setResultTransformer的比较
查看>>
MFC中的DC CDC HDC由来由去理解
查看>>
创建 和使用 CCAnimation
查看>>
(windows)Box2d mingw环境搭建,编译
查看>>
使用PerfView诊断.Net GC的问题
查看>>
Html5学习之旅(2)元素
查看>>
__declspec(dllexport)的作用
查看>>
汉诺塔问题求解思路
查看>>