
没什么问题啊,很好啊。就几个小问题,编译通过了啊。
一个文件:
#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语言打开多个文件或文件夹等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)