Const声明导致Xcode中的链接器错误

The*_*Art 3 xcode const header objective-c linker-errors

我正在创建一个openGL引擎(ES 1.1的一侧和ES 2.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. 
Run Code Online (Sandbox Code Playgroud)

为什么Xcode抱怨两个单独文件中的重复常量值?这些文件符合相同的协议......但大部分都是它们的连接.在C++中,此方法工作正常,但在转换为Objective-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}},
};
Run Code Online (Sandbox Code Playgroud)

解决方案:截至目前,似乎默认情况下,Objective-C中的const值受项目范围的影响,而不仅仅是文件的范围.在C++中,当创建const值时,范围自动限制在它所在的文件中.要在Objective-C中修复此问题,必须使用静态标记将范围限制为该特定文件.您也可以使用extern标签(但这会更多一点).

zne*_*eak 5

它在C++中工作,因为在C++中,const也暗示了一个全局变量static.在C中不是这种情况.当您更改为从C"继承"的Objective-C时,此行为将丢失并且const符号突然变为extern.

使用前缀const变量static来获得与C++相同的行为.