Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Как использовать #undef или вообще использовать не его
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
tiger() tiger() вне форума
Member
 
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2011
По умолчанию Как использовать #undef или вообще использовать не его - 10.09.2013, 12:56

Посоветуйте какую лучше применить концепцию.

Хочу сделать в проекте унифицированные сообщения об ошибках в едином стиле. Чтобы они выглядели так:

c Код:
ERROR:   main.c foo -1 UNKNOWN_ERROR
Message: main.c foo 0 OK

И чтобы в коде они выглядели одинаково, примерно так:

c Код:
if (error)
printf("%s %s %s %d %s\n", ERROR_PREFIX, SOURCE_PREFIX, FUNC_PREFIX, error, GetStringOfError(error));

Здесь ERROR_PREFIX и SOURCE_PREFIX можно задать дефайнами в начале каждого исходника, а вот как быть с FUNC_PREFIX? Можно ли его тоже дефайном делать в каждой функции? Например так:

c Код:
int foo(void)
{
#define FUNC_PREFIX foo

<...>
<... use FUNC_PREFIX ...>
if (something) return 1;
<... use FUNC_PREFIX ...>

#undef FUNC_PREFIX
return 0;
}

Смущает что: если #undef будет стоять всегда в конце, как быть с промежуточными return-ами? Если мы не доходим до строки #undef, а выходим раньше, что станет с FUNC_PREFIX?
Ответить с цитированием
  (#2 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 10.09.2013, 18:53

Вы неправильно понимаете логику работы препроцессора.

Обработка директив #define и #undef никак не завязана на выполнение программы. Она завязана на порядок прочтения исходного текста компилятором. То есть замена будет действовать строго на строки программы между #define и #undef, при этом не имеет значения, какие программные конструкции на этом участке используются. Замена происходит до распознавания программных конструкций - программа обрабатывается сплошным потоком, как простой текст.

И Ваша программа-пример не скомпилируется. Нужно писать
c Код:
#define FUNC_PREFIX "foo"
Ответить с цитированием
  (#3 (permalink)) Старый
tiger() tiger() вне форума
Member
 
Сообщений: 33
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 25.04.2011
По умолчанию 16.09.2013, 07:19

Понял, значит можно использовать #define и #undef. Я еще вычитал что есть встроенная переменная __func__, которую можно не определять и использовать как строковое имя каждой функции. Удобно.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как использовать LabelFlash? Квазар Софт и программы 3 05.03.2009 17:43
Ресурсы в .NET как их использовать Saracin .NET 2 25.04.2008 15:48
Как использовать VScroll fractal Visual Basic 0 05.05.2006 17:59
Как использовать ВЕБ сервисы Artur_gerasiuk C++ Builder 0 02.02.2006 14:34
Как Бд использовать для поиска iosin Prolog 2 15.10.2005 14:18
Как использовать ресурс из DLL Ammarty Visual C++ 5 27.09.2005 22:30
Как использовать Adler32 в VB? drHass Visual Basic 1 08.05.2005 01:03
Стоит ли вообще использовать фреймы imported_Step DHTML, JavaScript, VBScript 1 05.04.2005 13:18
ACDSee для 2D, а для 3D что использовать Anonymous Программирование графики 1 17.01.2004 00:56
ACDSee для 2D, а для 3D что использовать Anonymous Офтопик 0 11.12.2003 00:16
Удобно ли Вам использовать GC TNT Java 10 19.08.2003 22:35
Как использовать InfoPower4000pro Anonymous Delphi 1 24.06.2003 17:21



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов