经过楼上几位的帮助和我自己的分析,知道问题所在了。
楼上几位所说的对.
#include只是简单的把文件,包含到当前位置
假设
A.C
B.C
_____________________________
A.C:
void str_printf()
{
printf("this is \"a\" file\r\n");
}
B.C:
#include "A.C"
int main()
{
str_printf();
}
_____________________________
然后编译的时候,
B.C
就会形成下列的样子:
void str_printf()
{
printf("this is \"a\" file\r\n");
}
int main()
{
str_printf();
}
相当于A.C的内容全部包含到了B.C,那么很明显B.OBJ,肯定就包含了A.C文件的实现.
这个时候
A.C编译后同样有一个str_printf函数的定义,然后A.OBJ也存在str_printf的定义.
所以就会存在符号重定义的问题
two.obj : error LNK2005: "void __cdecl Add(int &)" (?Add@@YAXAAH@Z) already defined in DataType.obj
Debug/DataType.exe : fatal error LNK1169: one or more multiply defined symbols found
这个时候在B.C
只包含A.h这个头文件.
但是包含文件的时候
#include "stdafx.h"
#include <iostream>
#include "two.h"
这样的包含顺序才可以编译,如果"two.h"放在stdafx.h前面
error C2065: 'Add' : undeclared identifier
会出现找不到外部函数定义的问题.
从source file,移除A.c 再次编译,就不会出重定义的问题,因为,这个时候只会编译B.C,并不会再编译A.c
当然就不会出现,符号重定义的问题
#include "stdafx.h"
#include <iostream>
#include "two.cpp"
或者
#include "stdafx.h"
#include "two.cpp"
#include <iostream>
这样包含文件,都可以编译OK
________________________________________________________________
但是如果先包含这个文件.
#include "two.cpp"
#include "stdafx.h"
#include <iostream>
DataType.cpp(25) : error C2065: 'Add' : undeclared identifier
就会出现找不到函数的问题.总之不管是实现文件,还是头文件,只要放到stdafx.h前面,就无法编译
至于为什么出现这个问题,我还没研究明白.希望哪位懂这个,给解答一下
________________________________________________________________