我有一些基本上是这样的代码:
#include "MyClass.h"
#include <iostream>
using namespace std;
const char *items[4] = {"apple", "orange", "banana", "pear"};
MyClass::MyClass () {
cout << "items: " << items[0] << items[1] << items[2] << items[3] << endl;
}
在另一个类实现文件中,我有另一个名为items的全局变量,它是另一个类型的数组(自定义类)。两个实现文件都没有包含另一个,所以我认为范围会有所不同,在两个地方都可以使用项目作为变量名称。另外,如果我删除任何一个类中的项目声明,那么编译器会抱怨它没有被定义在该类中使用它的位置。这似乎支持了我的观点,即范围应该是分开的。当我运行它但输出是每次lnU knUVWnUjnU。如果我改变另一个类中的项类型也是一个const char *数组,那么它就像我在每个类中所期望的那样。不幸的是代码依赖于一堆乱七八糟的其他代码,所以提供一个工作示例是非常困难的。如果重要的话,我正在使用gcc 4.3.2。有人可以了解这里发生的事情吗?
答案 0 :(得分:0)
我没看到一堆乱七八糟的代码。你可以准备一个简单的例子。没有它,很难说为什么要打印垃圾,
在您显示的代码段中,数组项具有内部链接。因此,在其他模块中具有相同名称的任何其他声明都不会影响此模块。
如果同一模块中的相同名称被声明为具有内部和外部链接,则程序可能具有未定义的行为。但是我什么都不说,因为我没有看到一个简单的程序来证明这个问题。