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 __cplusplus
extern "C" {
#endifvoid 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、同一个C语言工程不同C文件之间的函数互相调用问题(一)、同一个C语言工程不同C文件之间的函数互相调用问题(二)、同一个C语言工程不同C文件之间的函数互相调用问题(三)

2、C语言一个源文件如何调用另一个源文件里的函数

3、C语言为什么无法include另一个源代码文件

4、cpp到obj再到exe,重定义的问题

5、C/C++不同文件夹下包含头文件的方法及#include的使用

6、“error LNK2019: 无法解析的外部符号”之分析

7、碰到“error LNK2019: 无法解析的外部符号”

8、3.C++和C混合编程

转载于:https://www.cnblogs.com/rainbow70626/p/8744933.html

[原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件相关推荐

  1. cmd执行bat结果不回显_cmd - 如何在bat文件中调用另一个bat文件

    情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调用b.bat,如下. a.bat @echo off echo I am a.ba ...

  2. cmd 如何在bat文件中调用另一个bat文件

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 情景一:两个bat文件在同一个目录下 有时候我们需要在一个bat文件中调用另一个bat文件,比如我们想在a.bat中调 ...

  3. java 调用其他构造函数_我如何在Java中调用另一个构造函数?

    是的,这是可能的: public class Foo { private int x; public Foo() { this(1); } public Foo(int x) { this.x = x ...

  4. c语言中memcpy函数_带有示例的C中的memcpy()函数

    c语言中memcpy函数 memcpy()函数 (memcpy() function) memcpy() is a library function, which is declared in the ...

  5. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  6. c语言中eof的作用,深入解读C语言中的符号常量EOF

    EOF是指文件的结束符,是一个宏定义 借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出 数量惊人的有用的代码.最简单的例子就是把输入一次一个字符地复制到输出, ...

  7. double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的

    java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float ...

  8. c语言中0x12是什么进制,C语言中进制知识汇总

    1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数 ...

  9. c语言中5l是数值或字符常量,C语言中什么叫做正确的数值或字符常量?

    用一对单引号将一个字符括起表示合法的字符常量.例如'a'.数值包括整型.浮点型.整型可用十进制,八进制,十六进制.八进制前面要加0,后面由0到7八个数表示. 在C语言中,字符常量有以下特点: 字符常量 ...

最新文章

  1. 【廖雪峰python入门笔记】Unicode编码_UnicodeDecodeError处理
  2. 分布式文件系统Hadoop
  3. python环境变量配置_Python环境变量的配置
  4. mysql 导入mongodb_mysql数据库迁移导入到mongodb详细教程
  5. sed删除空行,#开头的行,以及第一行
  6. 钱少也就算了,为啥我们还越来越忙?
  7. 微生物 研究_微生物监测如何工作,为何如此重要
  8. php 运行外部程序_PHP在linux上执行外部命令的方法
  9. absolute元素水平居中
  10. 关于事件委托的整理 ,另附bind,live,delegate,on区别
  11. 尝鲜之在Github上搭建Octopress博客
  12. 设计模式学习笔记之装饰者模式
  13. 让两个Div并排显示
  14. unity 保存数据到本地的方法
  15. 将图片转换为Base64编码字符串、解析Base64编码字符串后生成图片
  16. 【软件安装使用】pano2vr教程
  17. java 指纹匹配算法_java – 从生物识别指纹考勤设备中检索数据
  18. 暗影精灵5风扇怎么调_惠普暗影精灵5内部结构是怎么样的 他的散热效果好不好呢...
  19. elasticsearch数据迁移
  20. 中国首富“叒”换人了

热门文章

  1. cassandra 环境搭建
  2. Linux学习笔记11——文件I/O之二
  3. BNUOJ 1207 滑雪
  4. (转)C# 把我所积累的类库全部分享给博友(附件已经上传)
  5. JS面向对象编程实现
  6. 信息学竞赛的常数优化、常见问题、代码风格相关
  7. Servlet执行时要实现的方法
  8. gdb 收到SIGPIPE信号
  9. 园区网VLAN应用实例
  10. HTML与CSS(图解6):超链接