2014-07-15 2 views
0

Я хочу заменить вызов функции строкой с использованием предпроцессорных директив. Что-то вроде этого:Как заменить имя функции на константу строки в #define macro в C

#ifdef DEBUG 
    #define Func1(arg) "Function not supported" 
#endif 

Так в основном, когда кто-то называет эту функцию, я хочу ошибку компиляции, так что эта функция является невидимым в режиме DEBUG, а вместо этого, следующая строка печатается в сборнике журнал. Этот метод вызывает ошибку. Есть ли какие-либо другие средства для печати конкретной строки, которую я хочу, когда вызывается func1()?

+0

Просьба уточнить «Выдает ошибку». Это ошибка компиляции? Ошибка выполнения? Укажите описание ошибки и код на сайте использования. – Arkadiy

+0

точная ошибка: «Ошибка: выражение должно иметь тип функции« указатель-к »» .... Эта ошибка возникает в месте, где была вызвана эта функция. – Shubhi

+0

Является ли сообщение таким важным? – zoska

ответ

2

Самый очевидный способ архива такого поведения - установить команду #error. Однако, поскольку невозможно построить «условную директиву #error», я предполагаю, что следующий шаг - _Pragma оператор, введенный в C99. Вот решение, которое производит сообщения во время компиляции:

#include <stdio.h> 

#define DEBUG 1 

#ifdef DEBUG 
    #define Func1(arg) _Pragma("message \"Function not supported.\"") 
#endif 

void (Func1)(int arg) 
{ 
} 

int main(void) 
{ 
    Func1(1); 
    Func1(2); 
    Func1(3); 

    return 0; 
} 

компиляции (с gcc):

... 
check.c:15: note: #pragma message: Function not supported. 
check.c:16: note: #pragma message: Function not supported. 
check.c:17: note: #pragma message: Function not supported. 

Я знаю, что это не прямое решение (такое сообщение даже не рассматривается как предупреждение, так -Werror Безразлично ничего не меняйте), однако вы можете использовать, например, grep или любой другой способ сканирования результатов компилятора.

С GCC 4.8 также есть #pragma GCC error "message", что является прямым (но не переносным) решением. Проверьте this answer для получения дополнительной информации. Например:

#ifdef DEBUG 
    #define Func1(arg) _Pragma("GCC error \"Function not supported.\"") 
#endif 
+0

Проблема в моем случае: мне нужна ошибка компиляции в том месте, где вызывается функция. В вашем решении препроцессор будет обработан до того, как функция будет скомпилирована. Поэтому, когда обрабатывается последовательным образом, препроцессор не будет выполняться. – Shubhi

+0

@ user3840787: Фактическое место, где выполняется «функциональный макрос» Func1 (arg), - это 'Func1 (1);' инструкция в определении 'main'. Это не имеет значения, что макрос определен, без правильного вызова он ничего не делает. –

0

Вы можете использовать

#error "Function not supported" 

прервать компиляцию. Но, очевидно, когда кто-то имеет доступ к источнику, который может быть удален - так что конкретно вы пытаетесь сделать?

Если вы не доверяете этим людям своим источником, не предоставляйте их им. Связать его с .obj, определить «интерфейс» с помощью .h и только выдавать его.

+3

Я мог бы использовать #error ...:) Но это будет вызвано сразу же при обработке препроцессора, а НЕ при вызове функции. :(:( – Shubhi

1

Один из способов - просто оставить функцию неопределенной. Это приведет к ошибке во время соединения.

Если вы используете GCC, вы можете использовать один из его расширений, атрибут функции:

#ifndef DEBUG 
#define __nodebugonly 
#else 
#define __nodebugonly __attribute__((error("Function not supported"))) 
#endif 

void Func1(int arg) __nodebugonly; 
+0

+1, первая строка должна быть '#ifndef DEBUG'. –

+1

Правильно, я неправильно понял ваш вопрос в этом отношении. Поскольку' __debugonly' был бы неправильным, тогда я тоже это изменил. –

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

  • Нет связанных вопросов^_^