我看钱能的那本《C++程序设计教程》,第六章,程序结构的时候,6。1节有个例题//-------------------------
//--      ch6_1.prj      --
//-------------------------ch6_1.cpp
ch6_1_1.cpp//*************************
//**      ch6_1.cpp      **
//*************************#include <iostream.h>
void fn1();
void fn2();
int n;void main()
{
n=3;
fn1();   //fn1函数的定义在本文件中 cout << n << endl;
}
void fn1()
{
fn2();   //fn2函数的定义不在本文件中
}//***************************
//**      ch6_1_1.cpp      **
//***************************extern int n;    //n由另一个源文件定义void fn2()       //fn2()函数用于另一个源文件{
n=8;         //使用n
}我把这两段代码分别保存在两个cpp文件里面,ch6_1.cpp和ch6_1_1.cpp里面,怎么连接的时候会报错阿?
--------------------Configuration: ch6_1 - Win32 Debug--------------------
Compiling...
ch6_1.cpp
D:\C++\ch6_1.cpp(5) : error C2143: syntax error : missing ';' before '.'
D:\C++\ch6_1.cpp(5) : error C2501: 'ch6_1' : missing storage-class or type specifiers
D:\C++\ch6_1.cpp(5) : error C2143: syntax error : missing ';' before '.'
Error executing cl.exe.ch6_1.obj - 3 error(s), 0 warning(s)

解决方案 »

  1.   

    哦,原来是书上写错了,书上就没加//可是我一直想不通,ch6_1这个程序里面没有定义fn2()这个程序,那他怎么知道要到ch6_1_1里面去调用fn2()呢???
      

  2.   

    那就是说我连接时,连接器自动在我的机器上面找这个程序需要的某个变量或函数的定义吗?例如ch6_1和ch6_1_1两个程序,如果不在同一个目录里面也可以吗?
      

  3.   

    因为在预编译之后,以上3段就是一个整体了(因为prj是建立一个工程,是将两个cpp文件连接),是一堆二进制码,所以其实在ch6_1_1之前已经有过fn2()的声明了(在ch6_1中),因此是正确的. 但是要注意6_1,6_1_1的先后顺序.
      

  4.   

    其实我的问题就是编译器在编译ch6_1的时候怎么知道要到哪里去找ch6_1_1呢?
      

  5.   

    小弟我刚学c++不好意思,我只是在vc里面新建了一个c++ source file,然后编译了ch6_1,然后又新建了一个c++ source file,在编译了ch6_1_1,并没有什么工程啊???