Variadic函数使用枚举导致SIGILL信号

时间:2012-01-31 01:19:38

标签: c++ enums variadic-functions

是否可以将枚举作为参数传递给可变参数函数?我正在尝试执行以下操作:

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_VERTEXATTRIBUTE_TExTURE都声明为

enum AttributeLocation {
        ATTRIBUTE_VERTEX = 0,
        ATTRIBUTE_COLOR,
        ATTRIBUTE_NORMAL,
        ATTRIBUTE_TEXTURE0
    };

但程序刚刚终止。我发现,调试程序,错误发生在for循环后的第一行。所以我想知道是否有可能做到这一点,或者这是非法的。

1 个答案:

答案 0 :(得分:3)

这是因为将小于sizeof(int)字节大的整数类型传递给varargs函数会在堆栈上传递时将它们转换为sizeof(int)个字节。如果AttributeLocation小于sizeof(int)字节,则会在堆栈上推送sizeof(int)个字节,但只能通过sizeof(AttributeLocation)调用从堆栈中检索va_arg个字节。然后,当您尝试阅读char*时,您将获得AttributeLocation的其余字节以及您传递的const char*的一些字节。