是不是const数组不会被导出?该如何处理

是不是const数组不会被导出???
a.cpp:
const   char   arr[]   =   "12345 ";

a.h:
extern   const   char   arr[];


b.cpp:
#include   "a.h "
printf( "%s ",   arr);

提示找不到符号arr。ida观看a.obj也确实发现没有导出符号arr

如果把const去掉就能找到编过去。
难道const修饰的树组不会被导出?   我记得应该是static修饰才是不导出啊?

另外,   如果不是树组,是个指针的话
a.cpp:
const   char   *p   =   "12345 ";
a.h:
extern   const   char   *p;
b.cpp:
#include   "a.h "
printf( "%s ",   p);
那么就会导出编译通过。

我用的vc7。     是c++问题还是编译器问题?


------解决方案--------------------
a.cpp:

#include "a.h " //包含头文件
const char arr[] = "12345 ";
------解决方案--------------------
const的对象默认为内部链接,如果想使它具有外部链接,必须在定义的时候使用extern
所以,对于lz说到的第一种情形,只需将
const char arr[] = "12345 ";
改为
extern const char arr[] = "12345 ";
就可以了


至于lz提到的第二种情形,
const char *p = "12345 ";
p本身并不是const的对象,而是p指向的内容为const。
那么对于p这种非const的全局对象定义,默认为外部链接,所以不报错

如果要定义p本身为const,可以
const char *const p = "12345 ";



------解决方案--------------------

结案陈词:
1. extern 关键要用在定义方,而不是使用一方(当然也需要).定义的时候不是外部链接,再声明
一个不存在的extern变量也没有意义.

c语言可能比较注重使用static 和 extern来明确表示链接方式吧,但是c++一般代码在类中,
默认就是inline,也就比较少管这两个关键字了.
守则1, 不要将extern 定义放在头文件,而应该将extern声明放在头文件.
守则2, 将定义放在头文件可以,只要是static 定义.
守则3, 用c++类来包含不必要的外部元素,放在头文件,可以采用Inline,也可以采用分离.但是
分离的实现应该放在cpp中.

2.第二个就是语法问题了. const char *p = "12345 "; p并不是const,因而链接就不可能是
static.