一个简单的多文件C程序 我们总是出现error LNK2001: unresolved external symbol

一个简单的多文件C程序 我们总是出现error LNK2001: unresolved external symbol,第1张

没什么问题啊,很好啊。就几个小问题,编译通过了啊。

一个文件

#include<stdioh>

int main()

{   

extern void enter_string(char str[]); 

    extern void delete_string(char str[],char); //这个函数是有2个参数的

extern void print_string(char str[]);

    

char c,str[80];

enter_string(str);

scanf("%c",&c);

delete_string(str,c);

print_string(str);

return 0;

}

第二个文件:

#include <stdioh> //需要加上头文件

void enter_string(char str[80]) 

{

gets(str);         

}

void delete_string(char str[],char ch) 

{

int i,j;

for(i=j=0;str[i]!='\0';i++)

if(str[i]!=ch) //多了一个分号

str[j++]=str[i];

    str[j]='\0';

}

void print_string(char str[]) 

{

printf("%s\n",str);

}

下面是截图:

依我的经验来看,你出现这个问题,有可能是没有将几个文件放在同一个工程里面。

你看看我的,我是把2个源文件放在同一个工程里面,所以没有出问题。

dwp是工程文件,一个工作空间里可以放多个工程。工程就是你写的可以运行的带main的程序的集合。idb和pdb都是database文件。就是存储一些这个项目的基本数据信息。具体内容是啥我也不太清楚。c是C语言文件。就是你编写的程序ncb好像也是个数据库相关的东西。exe是可执行文件obj是C源文件进行编译之后,产生的中间代码。你写完的c文件会被编译成obj文件,然后通过链接器,将多个obj文件链接到一起,产生exe可执行文件Debug文件夹下是你进行Debug时,记录Debug信息的。基本上大概就是这些功能。这是VC60的目录结构。因为微软的集成开发环境功能比较复杂,所以需要弄的很多很多文件来记录这个工程的信息。如果你使用GCC编译。基本上就会产生两种文件。o文件,相当于这里的obj可执行文件更加详细的内容可以翻阅相关书籍。

在C语言中,对文件夹的 *** 作,专业的说法称为"切换路径/目录",而不是"打开",因为文件夹,并不是一个"真正的文件",而只是一个访问文件的目录

用C语言中的函数chdir,也就是change

directory

int

chdir(char

path)

--

使指定的目录path变成当前的工作目录,之后所有的文件 *** 作都是该目录下

比如,想切换到f盘test目录下可以这样:

chdir("f:\\test

");

返回0表示切换成功,否则,表示失败

1、如果,在一个c主程序中,以include形式包含了其他所有的引用文件,在编译过程中,编译器首先会将这些文件合并到一个临时文件中,然后再对这个临时文件进行编译。

2、如果,是作为一个工程,编译器会分别编译各个独立的文件(如果文件中有include按照上一步进行),然后再将编译好的初步结果用链接程序连到一起。

简单的说,每一个c或者cc都是一个编译单元,每一个编译单元编辑的结果是一个o或者obj之类的中间文件,至于是否是多文件,不需要关心,但是要保证不同的编译单元之间不要有重复的符号,这就是要避免重复包含。

每一个编译单元生成的目标文件o或者obj都会引用一些不在本目标文件中的符号,这些符号定义在别的o或者obj文件中, 链接器把他们联系在一起,所有的符号也就都有定义了,编译链接简单说来就是这样。

VC++60实现多文件程序:

1、必须创建工程,并将文件加入同一工程下;2、必须有自定义头文件(h)将多个源文件(c/cpp)关联起来,并将函数定义放在头文件中。

多个源文件需要在这个窗口创建:

创建完毕后如图:

第一个问题

请问,我是不是该这样做:

在mainc中#include

在func中同样#include

(好像是必需的,请详细解释)

这是必需的。因为编译器只是把包含文件的代码复制过来,既然你二个文件中都用到头文件的内容,那当然要包含头文件,否则就会出错。

我的观点,如果这两步都是必需的

那么当有很多个比如10个c程序每个里头都要#include

那么文件是不是会特别大,当有100个c程序都要包含一下的话,那么不是非常重复么?)

那当然是会重复的。不过这个对程序的运行效率没任何影响,只是在编译过程中对文件的分析时间会稍长些,这也是没有办法的事,全看代码编写者如何组织结构了。

第二个问题:

会的。解决的方法就是在可能被多次包含的头文件中开头加上#pragma

once,那样就可以保证此头文件代码只被执行一次,而不会造成头文件中函数多次重复定义至于引起这种情况的情况。当然你也可以自己用#ifdef等预编译处理来解决。你问的问题不就是这种情况么?mainc和func中都包含头文件touh

第三个问题:

当我在mainc中这样

#define

unchar

unsigned

char

那么当我在func中还需要重新创建替换宏unchar吗

可以不在创建而直接使用吗?

答案是需重新创建,不能直接使用。但你可以把一些在多个文件中使用的宏、全局变量等统一定义到一个头文件中,那这样就可以避免多次定义了。

以上就是关于一个简单的多文件C程序 我们总是出现error LNK2001: unresolved external symbol全部的内容,包括:一个简单的多文件C程序 我们总是出现error LNK2001: unresolved external symbol、C语言问题为什么我写好一个程序运行一下会出现多个文件、如何用c语言打开多个文件或文件夹等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9459811.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存