2013-08-23 3 views
1

Я пытаюсь создать прозрачные функции отладки PRTINF в OpenCL ядер, которые:Preproccessed функция Printf

  • Не загрязняет код (может быть вызвана из макс одна линия).
  • Скомпилируйте, если указанное условие препроцессора окажется неверным.

Проблема заключается в том, что printf является переменной функцией, и я не могу обернуть ее в переменный макрос, поскольку язык ядра OpenCL (C99-деривация) не поддерживает переменные макросы.

#if DEBUG_CONDITION 
printf("Any int %d\n",i); 
#endif 

Будет работать, но быстро сделает код нечитаемым.

if(DEBUG_CONDITION) printf("Any int %d\n",i); 

Это также будет работать, но потребует меня, чтобы позволить PRINTF прагм, потому что функции должны фактически ссылаться в коде, даже если я знаю, что они будут собраны прочь. (Из OpenCL 2.0 на, Printf будет определены свойства синхронизации, и никто не может знать наверняка, будут ли введены синхронизации семантика в бинарных до фактического удаления функции или нет.)

PRINTF("Any int %d\n",i); 

Я ищу что-то вроде этого (или похожего), которое выглядит красиво, но может полностью игнорировать ссылку prtintf alltogether.

+2

Как насчет чего-то типа 'PRINTF ((« any int% d », i))'? –

ответ

1

Как Kerrek СО уже предложил в своем комментарии:

#if DEBUG_CONDITION 
#define PRINTF(args) printf args 
#else 
#define PRINTF(args) 
#fi 

и использовать его в качестве

PRINTF(("Debugging i: %d", i)); 

Благодаря двойной paranthesis это не VARIADIC макро.

0

Если вы не можете использовать VARIADIC макросов, то почему бы не VARIADIC функции (которая является частью стандарта C)

#ifdef NDEBUG 
inline int debug_print(char *fmt, ...) 
{} 
#else 
int debug_print(char *fmt, ...) 
{ 
    /* implement this I'm too lazy */ 
} 
#endif 

Это приводит к вызову дополнительной функции, в отличие от макро (хотя, возможно, это может быть встраиваемыми), но это не имеет значения, как это происходит только тогда, когда вы звоните отладочный (так, кто заботится о производительности в то время)

+0

OpenCL не поддерживает вариационные функции или переменные макросы. printf является исключительным исключением. –

Смежные вопросы