是否可以将枚举作为参数传递给可变参数函数?我正在尝试执行以下操作:
GLenum ShaderManager::initialize()
{
GLuint program = loadShader("Flat", 2, ATTRIBUTE_VERTEX, "coord3d", ATTRIBUTE_TEXTURE0, "texcoord");
//...
}
GLuint ShaderManager::loadShader(std::string shaderName, ... )
{
GLuint program;
//...
va_list arglist;
va_start(arglist, shaderName);
int count = va_arg(arglist, int);
for(int i = 0; i < count; i++) {
AttributeLocation location = va_arg(arglist, AttributeLocation);
char * name = va_arg(arglist, char *);
glBindAttribLocation(program, location, name);
}
va_end(arglist);
//...
}
ATTRIBUTE_VERTEX
和ATTRIBUTE_TExTURE
都声明为
enum AttributeLocation {
ATTRIBUTE_VERTEX = 0,
ATTRIBUTE_COLOR,
ATTRIBUTE_NORMAL,
ATTRIBUTE_TEXTURE0
};
但程序刚刚终止。我发现,调试程序,错误发生在for循环后的第一行。所以我想知道是否有可能做到这一点,或者这是非法的。
答案 0 :(得分:3)
这是因为将小于sizeof(int)
字节大的整数类型传递给varargs函数会在堆栈上传递时将它们转换为sizeof(int)
个字节。如果AttributeLocation
小于sizeof(int)
字节,则会在堆栈上推送sizeof(int)
个字节,但只能通过sizeof(AttributeLocation)
调用从堆栈中检索va_arg
个字节。然后,当您尝试阅读char*
时,您将获得AttributeLocation
的其余字节以及您传递的const char*
的一些字节。