我在文件1CTestHello.cpp 声明了
extern void delete_string(char a[],char b[],char standard);
再调用文件2 file2.c中的delete_string(a,b,Standard);函数;
发现2个问题:
问题1;用extern实验发现必须用include,但查找资料,没有说这两个有必然关联。请问到底有没有必然关联?下面是实验:
如果文件1中不#include "file2.c",编译没问题,链接出错,提示:
CTestHello.obj : error LNK2001: unresolved external symbol "void __cdecl delete_string(char * const,char * const,char)" (?delete_string@@YAXQAD0D@Z)
Debug/TestHello.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.
TestHello.exe - 1 error(s), 0 warning(s)
如果文件1中#include "file2.c",编译没问题,链接没问题,一切正常;
示例如下:
文件1:CTestHello.cpp
#define PI 3.14
#include
#include
#include
///#include "file2.c"
void main()
{
//015-1-2字符串查找删除,多文件:
char a[]="abcdccdefc";
int len=strlen(a);
char b[10];
char Standard='c';
extern void delete_string(char a[],char b[],char standard);
delete_string(a,b,Standard);
//void stringdel(char a[],char b[],char Standard);
//stringdel(a,b,Standard);
printf("字符串b:%s\n",b);
for(int t=0;b[t]!='\0';t++)
{
printf("第i个元素:%c\n",b[t]);
}
}
文件二:file2.c
#include
extern void delete_string(char a[],char b[],char Standard)
{
int k=0;//a和b由于a有Standard,导致b下标相差的
int j=0;
int n=0;
int i=0;
for(;a[i]!='\0';i++)
{
if(a[i]!=Standard)
{
j=i-k;
b[j]=a[i];
n++;
}
else
{
k++;
}
}
b[n]='\0';
}
问题二:如果外部文件中的extern函数名,和本文件中的函数名重名,编译提示函数重定义,感觉不应该有这个提示啊?
编译提示:
--------------------Configuration: TestHello - Win32 Debug--------------------
Compiling...
CTestHello.cpp
d:\code\c\vc\testhello\ctesthello.cpp(321) : error C2375: 'stringdel' : redefinition; different linkage
d:\code\c\vc\testhello\file2.c(2) : see declaration of 'stringdel'
执行 cl.exe 时出错.
CTestHello.obj - 1 error(s), 0 warning(s)
实例如下:
文件1:CTestHello.cpp
#define PI 3.14
#include
#include
#include
///#include "file2.c"
void main()
{
//015-1-2字符串查找删除,多文件:
char a[]="abcdccdefc";
int len=strlen(a);
char b[10];
char Standard='c';
extern void stringdel(char a[],char b[],char standard);
stringdel(a,b,Standard);
//void stringdel(char a[],char b[],char Standard);
//stringdel(a,b,Standard);
printf("字符串b:%s\n",b);
for(int t=0;b[t]!='\0';t++)
{
printf("第i个元素:%c\n",b[t]);
}
}
static void stringdel(char a[],char b[],char Standard)
{
int k=0;//a和b由于a有Standard,导致b下标相差的
int j=0;
int n=0;
for(int i=0;a[i]!='\0';i++)
{
if(a[i]!=Standard)
{
j=i-k;
b[j]=a[i];
n++;
}
else
{
k++;
}
}
b[n]='\0';
}
文件二:file2.c
#include
extern void stringdel(char a[],char b[],char Standard)
{
int k=0;//a和b由于a有Standard,导致b下标相差的
int j=0;
int n=0;
int i=0;
for(;a[i]!='\0';i++)
{
if(a[i]!=Standard)
{
j=i-k;
b[j]=a[i];
n++;
}
else
{
k++;
}
}
b[n]='\0';
}