Objective c 常量声明导致Xcode中的链接器错误

Objective c 常量声明导致Xcode中的链接器错误,objective-c,xcode,header,constants,linker-errors,Objective C,Xcode,Header,Constants,Linker Errors,我正在创建一个openGL引擎(一侧用于ES1.1,另一侧用于ES2.0)。这两个引擎当前都有一些固定顶点(如下所示)。不幸的是,在编译时,我收到以下错误: ld: 1 duplicate symbol for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) with the duplicate symbol being _Verticies.

我正在创建一个openGL引擎(一侧用于ES1.1,另一侧用于ES2.0)。这两个引擎当前都有一些固定顶点(如下所示)。不幸的是,在编译时,我收到以下错误:

 ld: 1 duplicate symbol for architecture i386
 clang: error: linker command failed with exit code 1 (use -v to see invocation) with the duplicate symbol being _Verticies. 
为什么Xcode抱怨在两个单独的文件中存在重复的常量值?要符合相同协议的文件。。。但在很大程度上,这是他们之间的联系。在C++中,这种方法工作得很好,但是当翻译成Objtovi.C.<
//Define the positions and colors of two triangles
const Vertex Verticies[] = { //per vertex data
    {{-0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{0.5f, -0.866f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{0.0f, 1.0f},{1.0f, 1.0f, 0.5f, 1.0f}},
    {{-0.5f, -0.866f},{0.5f, 0.5f, 0.5f, 0.0f}},
    {{0.5f, -0.866f},{0.5f, 0.5f, 0.5f}},
    {{0.0f, -0.4f},{0.5f, 0.5f, 0.5f}},
};

解决方案:到目前为止,Objective-C中的const值在默认情况下受项目范围的约束,而不仅仅受文件范围的约束。在C++中,当创建const值时,作用域将自动限制到它所在的文件。要解决Objective-C中的此问题,必须使用static标记将作用域限制到该特定文件。您也可以使用extern标记(但这需要更多的工作)

如果
vertices
变量仅用于一个编译单元(文件),则应使用存储类说明符
static
声明它

这将防止编译器发出链接器可见的外部符号。用C语言来说:符号具有内部链接


<> > C和C++之间的许多细微差别之一是,C中的代码> const >不意味着内部链接。

< P>它在C++中工作,因为在C++中,一个带有<代码> const < />的全局变量也被暗示为<代码>静态< /代码>。C中的情况并非如此。当您更改为Objective-C(从C“继承”)时,此行为将丢失,
const
符号突然变成
extern


前缀您的代码> const < /C>变量>代码> static 以获得与C++中相同的行为。

<代码> const <代码>文件级别变量包含“代码>静态< /代码>。除非之前将数组定义为
外部常量
,否则它不太可能是问题所在。确实如此,我更大的问题是,为什么在两个不同的文件中声明这个const在C++中工作,而不是在Objtovi-C?@ ZNeAK中,这对于C++是唯一正确的,但它不是C。那么,问题就在这里。你应该在你的问题中真正提到它在C++中工作,并且停止在Objtovi.C.在我的声明结束时,用C++来说明这个方法很好。我将澄清这一点,以防有任何混淆。在谈论变量时使用术语
static
,这是令人困惑的,因为关键字有不同的含义。在这种情况下,说
const
意味着“内部链接”要清楚得多。谢谢你的解释。我真的不知道,但现在我知道了。有趣的事实!