glVertexAttribPointer调用中强制转换为void*是合法的C++吗
Is cast to void* in a glVertexAttribPointer call a legal C++?
这实际上是一个关于C++的问题,而不是OpenGL。我正在学习OpenGL教程(我刚刚开始(,作者使用C++(而不是C(。我的问题是glVertexAttribPointer
将偏移量参数作为const void*
。由于该参数只是简单地告诉OpenGL在使用glBufferData()
复制的顶点数组中第一次出现给定顶点属性的位置,因此我希望它应该是std::ptrdiff_t
类型。SO上的这篇文章解释了void*
被用作参数类型的原因,但我想知道为什么这种用法在C++中是合法的。例如,上面提到的教程只是将偏移量的值以字节为单位强制转换为void*
,就像下面的调用一样:
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
在我看来,这种方法是不合法的,因为reinterpret_cast
的cprefence文档中说
任何整数或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回相同指针类型的指针保证具有其原始值,否则生成的指针无法安全地解引用(反向的往返转换不能保证相同指针可能具有多个整数表示(
因此,如果我正确理解这一点,偏移量的std::ptrdiff_t
值(似乎就是这里需要的值(在转换为void*
之后可能会丢失。我想念什么?
"不保证"并不意味着"保证失败";意思是"没有保证"。这意味着实现可能保留也可能不保留转换。
glVertexAttribPointer
API需要C或C++的实现,该实现保留整数->指针->整数转换。就像它需要一个提供IEEE-754浮点类型以及8/16/32位整数的C或C++实现一样。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 错误:在为指针赋值时,void值没有被忽略