В ноябре прошлого года Дмитрий Грибенко, разработчик компилятора clang из Киева, представил новое расширение clang: проверка типов в функциях, интерпретирующих тип аргумента A, переданного по указателю на void*, различными способами в зависимости от значения аргумента B.
Запутанная фраза, так что приведу пример. Вот объявления двух функций, способных принять массив вершин в разных форматах путём различной интерпретации указателя на void:
А вот как они используются:
Видеодрайвер смотрит на аргумент type и в зависимости от него интерпретирует аргумент pointer как указатель на массив float, double, unsigned int, unsigned byte или на что-то ещё.
Clang, начиная с версии clang 3.2, может проверять типы таких аргументов, причём для этого будет достаточно внести изменения в заголовочный файл gl.h либо в любое другое место между gl.h и вашим кодом. Изменения небольшие (в сравнении с шаблонными классами) и безопасные для остальных компиляторов.
Подробное описание есть в документации [1], а для демонстрации я добавил набольшой заголовочный файл на гитхаб: https://github.com/sergey-shambir/clang_opegl_typesafety.
[1] http://clang.llvm.org/docs/LanguageExtensions.html#type-safety-checking
Запутанная фраза, так что приведу пример. Вот объявления двух функций, способных принять массив вершин в разных форматах путём различной интерпретации указателя на void:
void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); void glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer);
А вот как они используются:
glVertexPointer(3, GL_DOUBLE, 0, m_verticies.front()); glNormalPointer(GL_DOUBLE, 0, m_normales.front());
Видеодрайвер смотрит на аргумент type и в зависимости от него интерпретирует аргумент pointer как указатель на массив float, double, unsigned int, unsigned byte или на что-то ещё.
Clang, начиная с версии clang 3.2, может проверять типы таких аргументов, причём для этого будет достаточно внести изменения в заголовочный файл gl.h либо в любое другое место между gl.h и вашим кодом. Изменения небольшие (в сравнении с шаблонными классами) и безопасные для остальных компиляторов.
Подробное описание есть в документации [1], а для демонстрации я добавил набольшой заголовочный файл на гитхаб: https://github.com/sergey-shambir/clang_opegl_typesafety.
[1] http://clang.llvm.org/docs/LanguageExtensions.html#type-safety-checking
Комментариев нет:
Отправить комментарий