jjm*_*jjm 1 syntax pointers objective-c ios
我正在使用OpenGL着色器,它更喜欢C字符串到NSStrings,而且我遇到了以下奇怪的问题:
相关事实是这样的
1)shaderSource定义为
NSString* shaderSource
Run Code Online (Sandbox Code Playgroud)
2)glShaderSource的签名是
glShaderSource(GLuint shader, GLuint count, const GLchar** string, const GLint *length)
Run Code Online (Sandbox Code Playgroud)
这有效:
int len = [shaderSource length];
const char *cstr = [shaderSource UTF8String];
glShaderSource(shader, 1, &cstr, &len);
Run Code Online (Sandbox Code Playgroud)
这不起作用:
glShaderSource(shader, 1, &[shaderSource UTF8String], &[shaderSource length]);
Run Code Online (Sandbox Code Playgroud)
我在这里显然不了解客观方面的问题,我想纠正这个问题,所以如果你这么倾向,请祈祷告诉,WTF?
您似乎正在使用&[shaderSource UTF8String]
为您提供额外的间接级别,因此类型将是正确的,因为glShaderSource
需要指向指针的指针.但是你不能只是把&
任何东西放在前面来获得它的指针.
&x
表示"返回x的地址"; 为了理所当然,x
必须是一个符号,而不是一个表达.你不能写你不能写&[shaderSource UTF8String]
的相同理由&(1 + t)
.这只是一个表达式,您需要将值存储在某处,然后才能传递地址(存储它的位置).
如果您习惯使用C-structs,这可能会让您感到困惑,因为如果您有一个foo
带成员的结构bar
,您可以通过编写来获取成员的地址&foo.bar
.但Objective-C对象不是结构(从技术上讲,它们是不透明的结构).您通过发送消息从它们获取属性值,这与函数调用基本相同.因此,如果foo
是一个对象并且bar
是一个属性,&foo.bar
(这实际上是简单的&[foo bar]
)是一个无效的表达式.
归档时间: |
|
查看次数: |
1414 次 |
最近记录: |