Есть куча кода, использующего OpenGL. Мне нужно найти все места, где используются функции OpenGL и заменить на свою реализацию.
Вот такой метод, естественно, не срабатывает:
#define glBegin(...) #pragma error Replace glBegin() with your own implementation
Хочется сделать так, чтобы при компиляции в том месте, где используется какая-либо из функций, компилятор сообщал об ошибке, желательно, с осмысленным текстом.
Можно ли это сделать при помощи препроцессора С? Если можно, то как?
Здравствуйте, LuciferSingapore, Вы писали:
LS>Есть куча кода, использующего OpenGL. Мне нужно найти все места, где используются функции OpenGL и заменить на свою реализацию. LS>Вот такой метод, естественно, не срабатывает: LS>
LS>#define glBegin(...) #pragma error Replace glBegin() with your own implementation
LS>Хочется сделать так, чтобы при компиляции в том месте, где используется какая-либо из функций, компилятор сообщал об ошибке, желательно, с осмысленным текстом. LS>Можно ли это сделать при помощи препроцессора С? Если можно, то как?
Как-то так:
my_glBegin(...)
{
// Тут новое тело функции.
}
#define glBegin my_glBegin
и пусть компилятор ругается на отсутствующую функцию.
Продвинутый способ:
В C99/C++0x есть оператор _Pragma() эквивалентный #pragma, только принимающий уже закавыченную (и экранированную) строку.
#define PRAGMA_ERROR(text) _Pragma( "error " text ) // text должен быть строкой#define PRAGMA_ERROR_GL(funcname) PRAGMA_ERROR( "Please replace " #funcname " with your own implemenation" )
#define glBegin(...) PRAGMA_ERROR_GL(glBegin)
К>и пусть компилятор ругается на отсутствующую функцию.
Ругаться будет линкер, что не устраивает.
К>Продвинутый способ: К>В C99/C++0x есть оператор _Pragma() эквивалентный #pragma, только принимающий уже закавыченную (и экранированную) строку. К>
К>#define PRAGMA_ERROR(text) _Pragma( "error " text ) // text должен быть строкой
К>#define PRAGMA_ERROR_GL(funcname) PRAGMA_ERROR( "Please replace " #funcname " with your own implemenation" )
К>#define glBegin(...) PRAGMA_ERROR_GL(glBegin)
К>
Здравствуйте, Кодт, Вы писали:
К>Продвинутый способ: К>В C99/C++0x есть оператор _Pragma() эквивалентный #pragma, только принимающий уже закавыченную (и экранированную) строку. К>
К>#define PRAGMA_ERROR(text) _Pragma( "error " text ) // text должен быть строкой
К>#define PRAGMA_ERROR_GL(funcname) PRAGMA_ERROR( "Please replace " #funcname " with your own implemenation" )
К>#define glBegin(...) PRAGMA_ERROR_GL(glBegin)
К>
Оказывается, никакого #pragma error в GCC нет, там только #error. Соответственно способ не работает.
Но я добился того, чего хотел, через _Pragma("message \"Use your own glBegin\"").
Ошибку компиляции это не вызывает, но в логе сборки я могу найти все интересующие меня места в исходном тексте.
К>>и пусть компилятор ругается на отсутствующую функцию.
LS>Ругаться будет линкер, что не устраивает.
Если это не голый Си, то ругаться будет всё-таки компилятор. Не надо даже объявлять эту функцию!!!
А для голого си (с умолчательным объявлением функций int f(...)) можно явно объявить функцию с уникальным типом аргумента.
typedef struct {} UNIQUE_TYPE; /* можно один тип на все функции-ошибки */void _ERROR_replace_glBegin(UNIQUE_TYPE);
#define glBegin _ERROR_replace_glBegin
и снова будет ругаться компилятор, а до линкера дело не дойдёт.
Здравствуйте, Кодт, Вы писали:
К>Если это не голый Си, то ругаться будет всё-таки компилятор. Не надо даже объявлять эту функцию!!! К>А для голого си (с умолчательным объявлением функций int f(...)) можно явно объявить функцию с уникальным типом аргумента. К>
К>typedef struct {} UNIQUE_TYPE; /* можно один тип на все функции-ошибки */
К>void _ERROR_replace_glBegin(UNIQUE_TYPE);
К>#define glBegin _ERROR_replace_glBegin
К>
К>и снова будет ругаться компилятор, а до линкера дело не дойдёт.
Зачем так сложно?
#define glBegin(x) typedef int _ERROR_replace_glBegin[-1]
или ещё проще
#define glBegin(x) DO_NOT_USE_ME EVER
то что glBegin является вызывом ф-ции не значит, что макрос должен разворачиваться в вызов ф-ции.
Здравствуйте, LuciferSingapore, Вы писали:
LS>Есть куча кода, использующего OpenGL. Мне нужно найти все места, где используются функции OpenGL и заменить на свою реализацию. LS>Вот такой метод, естественно, не срабатывает: LS>
LS>#define glBegin(...) #pragma error Replace glBegin() with your own implementation
LS>Хочется сделать так, чтобы при компиляции в том месте, где используется какая-либо из функций, компилятор сообщал об ошибке, желательно, с осмысленным текстом. LS>Можно ли это сделать при помощи препроцессора С? Если можно, то как?
Если речь идет о GCC, то никакого препроцессора не надо, просто объяви ее с соответствующим атрибутом:
void glBegin(GLenum) __attribute__((error("Replace glBegin() with your own implementation")));
Сообщение об ошибке будет таким:
error: call to 'glBegin' declared with attribute error: Replace glBegin() with your own implementation