关于extern的一个问题
我现在有一个工程1.proj,该工程里有三个文件a.h,a.cpp,b.cpp
a.h里面有一个extern int array[];
a.cpp里会使用数组array[],数组array[]是在b.cpp里定义的。
问题是:如果b.cpp没有包含a.h,编译就过不进去,包含了没问题。我不明白为啥,array声明为extern后,编译器不会自己去寻找数组的定义吗?
还有一个问题,假如我现在还有一个工程2.proj,1和2在一个solution里,如果2里面有一个c.cpp,c.cpp包含了a.h,这时候如果c.cpp调用了数组array,链接过不去。我想问的是,是不是extern不能跨工程啊
[解决办法]
参阅
程序员的自我修养—链接、装载与库
[解决办法]
你的第一个问题我在VS2010中试了,没出错
//a.h
extern int a[];
//a.cpp
#include "a.h"
void fun()
{
a[0] = 1;
}
//b.cpp
int a[] = {1,2,3};
[解决办法]
我是说,你认为有了extern,编译器就会自己去其他文件下找这个东西,而不用引入头文件是很有问题的。因为标准上从没有说一定可以做到,关键是有的编译器允许,有的不允许。正确的作法是指定查找的文件(include相应的文件),而不是让编译器盲目的全局搜索。