日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2023/12/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  C/C++語(yǔ)言中,如何在main.cpp中調(diào)用另一個(gè).c文件主要有5種思路:

  1、在VS2012 IDE中,將被引用的.c文件后綴名全部修改為.h,然后通過(guò)IDE的解決方案資源管理器中鼠標(biāo)右鍵單擊“頭文件”-"添加"-“現(xiàn)有項(xiàng)”,選中修改后綴名后的.h文件-"添加",將待引用的文件添加到工程中。

  添加到“頭文件”而不是“源文件”的作用:主要是使頭文件的項(xiàng)類(lèi)型屬性為“C/C++ 標(biāo)頭”,而不是“C/C++ 編譯器”。后者是將該文件獨(dú)立編譯成目標(biāo)文件*.obj。用戶(hù)可右鍵單擊某個(gè).h文件-屬性-配置屬性-常規(guī)-項(xiàng)類(lèi)型,來(lái)查看。

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

#include "13lman.h"

  然后在需要的地方,直接調(diào)用該函數(shù)即可,如下:

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

  2、不用修改文件擴(kuò)展名,直接將待引用的.c文件添加到“源文件”下面,按照1的步驟將待引用的文件的"項(xiàng)類(lèi)型“修改為“C/C++ 標(biāo)頭”。該方法的本質(zhì)是將*.c文件當(dāng)做*.h使用。如下圖所示:

  

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

#include "13lman.c"

  然后在需要的地方,直接調(diào)用該函數(shù)即可,如下:

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

  ?3、首先,在IDE中右鍵選中頭文件-添加-新建項(xiàng)-Visual C++-頭文件(.h)-輸入文件名,創(chuàng)建新的.h文件。如下圖所示:

  接著,在function.h文件來(lái)聲明這些待調(diào)用的函數(shù):

#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文件添加到源文件節(jié)點(diǎn)下面。將其項(xiàng)類(lèi)型設(shè)置為“C/C++ 編譯器”,預(yù)編譯頭設(shè)置為“不使用預(yù)編譯頭”。如下圖所示:

  接下來(lái),在待引用的.c文件中包含function.h頭文件(貌似這一步不用也可以編譯-鏈接-運(yùn)行成功???):

#include "function.h"

  緊接著,在主調(diào)用文件main.cpp中,文件中包含待引用的.c文件:

#include "13lman.c"

  最后,在需要的直接調(diào)用該函數(shù)即可,如下:

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

  4、如果main.cpp需要調(diào)用的.c文件還需要依賴(lài)其它.c文件,則可以按照下圖所示的方法設(shè)置各個(gè)文件的編譯屬性:

  前提是:所有的.c文件添加到“源文件”節(jié)點(diǎn)下面,將其項(xiàng)類(lèi)型設(shè)置為“C/C++ 編譯器”,預(yù)編譯頭設(shè)置為“不使用預(yù)編譯頭”(除了最后一個(gè).c文件)。

  接著,在主調(diào)用文件main.cpp中,文件中包含待引用的.c文件:

#include "13lman.c"

  然后,在13lman.c文件中包含所依賴(lài)的4rinv.c文件:

#include "4rinv.c"

  最后,在需要的直接調(diào)用該函數(shù)即可,如下:

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

  5、?所有的.c文件添加到“源文件”節(jié)點(diǎn)下面,將其項(xiàng)類(lèi)型設(shè)置為“C/C++ 編譯器”,預(yù)編譯頭設(shè)置為“不使用預(yù)編譯頭”。如果直接編譯-鏈接會(huì)輸出“error LNK2019: 無(wú)法解析的外部符號(hào)”鏈接錯(cuò)誤。

  問(wèn)題原因:C語(yǔ)言和C++語(yǔ)言混編,因?yàn)镃++支持函數(shù)重載所以C++編譯器生成的庫(kù)文件中的函數(shù)名會(huì)面目全非,例如C編譯器會(huì)生成 _readRegmark 這個(gè)函數(shù)名,而C++編譯器則生成了"void __cdecl readRegmark(char *)" (?readRegmark@@YAXPAD@Z)這么個(gè)函數(shù)名。當(dāng)你的函數(shù)是用C語(yǔ)言寫(xiě)的,VS編譯器會(huì)按C語(yǔ)言規(guī)則編譯,但鏈接器卻不知道還傻傻的用C++規(guī)則的函數(shù)名去找,當(dāng)然就找不到了。

  解決辦法:在C語(yǔ)言的頭文件或主動(dòng)調(diào)用的main.cpp文件的最開(kāi)始部分加入如下代碼:

#ifdef __cplusplus extern "C" { #endifvoid readRegmark(char *regmark); //這里寫(xiě)函數(shù)聲明 #ifdef __cplusplus } #endif

  或者,更簡(jiǎn)潔一些:

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[]); }

  這樣的話(huà)就可以編譯-鏈接成功了。上面的解決辦法適用于待調(diào)用的.c文件中的函數(shù)還依賴(lài)于其他文件中的其它函數(shù)的情況。如果主動(dòng)調(diào)用文件main.cpp還需要使用其它.c文件的函數(shù),也可以用同樣的方法解決。推薦使用第一種方法。因?yàn)榈谝环N方法既能夠讓.cpp文件能夠包含這個(gè).c文件,又能讓其它.c文件能夠包含這個(gè).c文件。需要注意的是:__cplusplus是C++編譯器內(nèi)置的宏。

  對(duì)OpenGL比較熟悉的用戶(hù)可能會(huì)發(fā)現(xiàn)在OpenGL的頭文件GL.h中的開(kāi)頭和結(jié)尾部分就使用了上面的用法,如下圖所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?             開(kāi)頭部分 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??結(jié)尾部分

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ????

?

?

參考鏈接:

1、同一個(gè)C語(yǔ)言工程不同C文件之間的函數(shù)互相調(diào)用問(wèn)題(一)、同一個(gè)C語(yǔ)言工程不同C文件之間的函數(shù)互相調(diào)用問(wèn)題(二)、同一個(gè)C語(yǔ)言工程不同C文件之間的函數(shù)互相調(diào)用問(wèn)題(三)

2、C語(yǔ)言一個(gè)源文件如何調(diào)用另一個(gè)源文件里的函數(shù)

3、C語(yǔ)言為什么無(wú)法include另一個(gè)源代碼文件

4、cpp到obj再到exe,重定義的問(wèn)題

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

6、“error LNK2019: 無(wú)法解析的外部符號(hào)”之分析

7、碰到“error LNK2019: 無(wú)法解析的外部符號(hào)”

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

轉(zhuǎn)載于:https://www.cnblogs.com/rainbow70626/p/8744933.html

總結(jié)

以上是生活随笔為你收集整理的[原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。