1

我正在使用 OpenGL 着色器,它更喜欢 C 字符串而不是 NSStrings,我遇到了以下奇怪情况:

相关事实是

1) shaderSource 定义为

NSString* shaderSource

2) glShaderSource 的签名是

glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)

这有效:

int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);

这不起作用:

glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);

我显然不明白这里关于目标 c 的一些东西,我想纠正这个问题,所以如果你有这种倾向,请告诉我,WTF?

4

1 回答 1

5

您似乎正在使用&[shaderSource UTF8String]为您提供额外的间接级别,以便类型正确,因为glShaderSource需要指向指针的指针。但是你不能只是把&任何东西放在前面以获得指向它的指针。

&x表示“返回 x 的地址”;要使其有意义,x必须是一个符号,而不是一个表达式。你不能写作&[shaderSource UTF8String]的原因与你不能写作的原因相同&(1 + t)。这只是一个表达式,您需要将值存储在某处,然后才能传递地址(存储它的位置)。

如果您习惯于 C 结构,这可能会令人困惑,因为如果您有一个foo带有 member的结构bar,您可以通过编写 来获取成员的地址&foo.bar。但是 Objective-C 对象不是结构(好吧,从技术上讲,它们是不透明的结构)。您通过向它们发送消息来从它们那里获取属性值,这与函数调用基本相同。所以 iffoo是一个对象并且bar是一个属性,&foo.bar(它实际上是 的简写&[foo bar])是一个无效的表达式。

于 2012-07-02T02:57:12.597 回答