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

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转盘脚本编辑器学习1

DirectShow 好https://www.cnblogs.com/xkfz007/articles/4523998.html https://www.cnblogs.com/xkfz007/p/4523977.html 多媒体播放器介绍 https://www.cnblogs.com/xkfz007/category/322715.html LONG_PTR是用于指针精度的long类型。 在将指针强制转换为long类型以执行指针运…

C语言到嵌入式Linux开发项目指导

C语言到嵌入式Linux开发项目指导 第一阶段C语言 1.常量与变量,数据类型,数据类型转换,数据输入与输出; 2.C语言运算符,C语言操作符,C语言表达式,表达式优先级; 3.C语言流程控制&a…

[零基础学JAVA]Java SE应用部分-35.JAVA类集之四

JAVA按以下重要顺序 面向对象 类集框架 JDBC 文件编程本季目标主要讲解以下的内容: Collection List Set Map Iterator ListIteator Enumeration for…each语句(JDK 1.5的新特性) Comparable接口 二叉树1、类集结构&#xff08…

【Mysql】之视图操作

一、视图实例1-创建视图及查询数据操作 首先,创建三个表:user、course、user_course 表:user CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,account varchar(200) NOT NULL,name varchar(200) NOT NULL,address varchar(500) DEFA…

TERMINAL

CListBox常用函数 https://www.cnblogs.com/whzym111/p/6214597.html、 https://blog.csdn.net/foreverhuylee/article/details/24638615 AfxGetApp()->GetMainWnd()和AfxGetMainWnd()的区别 获取的是主线程的窗口句柄。 AfxGetMainWnd()获取的是所在线程的窗口句柄。 在…

可在单片机上运行的简易图形库

来源:电子森林,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)发现一个网站 - http://www.technoblogy.com/,基本都是关于用ATtiny单片机做各种创意设计的,非常适合初学单…

欧拉回路 欧拉路径

欧拉路径(瞎)定义 : 如果有一条路径使得能够走完所有的边且每一条边经过有且只有一次,这样的路径叫做欧拉路径 欧拉回路定义 : 如果有从起点出发最后回到起点的一条路径使得能够走完所有的边且每条边经过有且只有一次,称其为欧拉回…

MD5函数

用md5函数 https://blog.csdn.net/whatday/article/details/8024355 MD5算法原理 https://www.cnblogs.com/hjgods/p/3998570.html 其他方法 https://blog.csdn.net/wudishine/article/details/42466831

MMU所起的作用

MMU所起的作用 一、名词解释 ①逻辑地址(虚拟地址) 用户程序经编译、链接以后形成的每条指令或数据单元的地址,这些地址都是相对于某个基地址来编制的。 ②逻辑地址空间 某个用户程序的虚拟地址的集合。 ③物理地址(绝对地址…

终于搞清楚开漏输出和推挽输出这个鬼东西

先说下推挽输出,简单的说,就是想输出高电平,就输出高电平,想输出低电平就输出低电平。推挽电路上面是NPN三极管,下面是PNP三极管,请注意输入端和输出端的波形。下面是输入波形当输入为正时,上面…

被称为“C#圣经”的权威著作!

媒体评论 “哇,这本书太棒了!对.NET 3.5和CLR的阐释非常深入。它已经成为我的头号参考书。强烈推荐给所有.NET程序员。” ——Jeff Wilcox,微软.NET开发团队资深工程师 “Troelsen大师王者归来了!C#程序员分为两类:读…

Dojo API中文 Dojo内容模块概览,初学者

官网:http://dojotoolkit.org/reference-guide/1.10/dojo/index.html#dojo-dojo的翻译 dojo 内容: dojo dojo/dojodojo/_baseAreas of Functionalitydojo是dojo工具箱的基础包。有时被称为“核心”,它包含了最重要的一般适用的软件包和模块。…

分享一篇很不错的CMake入门文章,值得收藏细读!

https://www.hahack.com/codes/cmake/▌什么是 CMake?你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循…

CMapStringToPtr::SetAt\CAsyncSocket

CMapStringToPtr::SetAt CMapStringToOb::SetAt 将元素插入到映射;如果找到匹配项,将替换现有元素。 主要方法要在地图中插入元素。 void SetAt( LPCTSTR key, CObject* newValue);参数 key 指定为新元素的键的字符串。 newValue 指定CObject是新元素的值的指针。…

自我鼓励

每一个优秀的人,都有一段沉默的时光,那一段时光,是付出了很多努力,忍受了很多的孤独和寂寞,不抱怨不诉苦,只有自己知道,而当日后说起时,连自己都能被感动的日子。

例用C# 变更文件夹时间

想变更文件夹的时间.以前做了一个软件.是变更文件的时间,应用了C# API.这次和上一次相同,用Form来通过外部对时间进行确认.确认后应用C#中,System.IO ->Directory->SetCreationTime 来对时间进行变更.以下是C#应用的例子.基本相同.但是,不要忘记小问题,下面的例子的命名空…

Linux 30岁,这些年经历了什么?

3月19日,Linux基金会在Twitter上发布推文宣布,其小企鹅的标志“Tux”已经30周岁了,还为其设计了一系列的庆祝海报,以便大家转发分享。虽然离Linux的生日还有一段时间,但是今年Linux基金会已经提前先帮小企鹅“Tux”过生…

用CSS画基本图形

用CSS画基本图形 1、正方形 代码如下: #square { width: 100px; height: 100px; background: red; } 2、长方形 代码如下:#rectangle { width: 200px; height: 100px; background: red; } 3、圆形 代码如下:#circle { width: 100px; height: 100px; …

输出函数

C语言中基本的输入输出函数有: putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程…

人格魅力的六法宝

人格魅力的六法宝 1、学会沉默 沉默是一种温柔,一种甜甜的爱心,一种东方的冰清玉洁的美丽;沉默是一种力度,一种坚韧,一种成竹在胸的自信和威仪。在回答某一具体问题时,沉默是你最好的回答。 2、学会微笑 微…