Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод диагностических утверждений через макросы, Создать аналог STATIC_CHECK из loki 
V
    Опции темы
null56
Дата 13.10.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Всем привет
Возник интерес к макросам, а конкретно к тому, как можно реализовать аналог статической обработки диагностических сообщений из книги Александреску, только без классов, а через макросы....
Приблизительно, то чего я хочу  добиться приведу 
Код


#define ERROR __THIS_IS_MY_ERROR

#define CHECK(val) 
        if (val > 0) \
                ERROR;

// использование
int main()
{
        int a = 1;
        CHECK(a);
        return 0;
}


На выходе хочу увидеть при val > 0 ошибку компиляции, которая содержит "__THIS_IS_MY_ERROR"
На сколько я знаю, это возможно, хотя могу ошибаться

Заранее благодарен за помощь

Добавлено через 7 минут и 47 секунд
ну переменную проверить не получится... так как ее значение известно во время программы... а вот допустим что - то типа этого 

Код

#define VALUE 3

CHECK(VALUE)

PM MAIL   Вверх
EgorTheBlade
Дата 13.10.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 5.12.2009

Репутация: нет
Всего: -1



Задефайнити функцию которая ловит и показывает ерроры.
PM MAIL Skype   Вверх
djamshud
Дата 13.10.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



Код

#if 42!=42
#error OMG
#endif


В макрос это не запихать.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
mes
Дата 13.10.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



вот простой вариант :
Код

#define STATIC_CHECK(cond, name) {  enum { eCond = (cond)? 1 : -1 };  \
                                    char STATIC_CHECK__ ## name[eCond];      \
                                    (void)STATIC_CHECK__ ## name;  }


int main ()
{
   STATIC_CHECK ( 1>0, test_true) 
   STATIC_CHECK ( 1<0, test_false )
}

варианты поэлегантней легко найти в гугле ..



--------------------
PM MAIL WWW   Вверх
djamshud
Дата 13.10.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 8
Всего: 39



В таком случае получится невразумительная ошибка, а никак не __THIS_IS_MY_ERROR :)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
null56
Дата 13.10.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Цитата(djamshud @  13.10.2010,  12:16 Найти цитируемый пост)
В таком случае получится невразумительная ошибка, а никак не __THIS_IS_MY_ERROR smile 

ну почему же... туда в аргументе можно передать и имя ошибки или прописать ошибку прямо внутри
Код

#define MY_VAL_0 0
#define MY_VAL_1 1

#define STATIC_CHECK(val) \
{ \
     enum { eCond = (val > 0)? 1 : -1 };  \
     char __THIS_IS_MY_ERROR[eCond];      \
     (void)__THIS_IS_MY_ERROR;  }

   STATIC_CHECK (MY_VAL_0);
   STATIC_CHECK (MY_VAL_1);


вывод
Цитата

main.c:13: ошибка: размер массива ‘__THIS_IS_MY_ERROR’ отрицательный


наверное то, что нужно...  спасибо



Это сообщение отредактировал(а) null56 - 13.10.2010, 12:46
PM MAIL   Вверх
mes
Дата 13.10.2010, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(djamshud @  13.10.2010,  11:16 Найти цитируемый пост)
В таком случае получится невразумительная ошибка, а никак не __THIS_IS_MY_ERROR smile 

1. не совсем невразумительная.. на gcc вида:
   size of array '__THIS_IS_MY_ERROR' is negative 

2.  для вразумительной ошибки нужно нарушить условие тс: 
Цитата(null56 @  13.10.2010,  10:28 Найти цитируемый пост)
как можно реализовать аналог статической обработки диагностических сообщений из книги Александреску, только без классов, а через макросы....







--------------------
PM MAIL WWW   Вверх
null56
Дата 13.10.2010, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



mes, вы правильно поняли мой вопрос, спасибо

Это сообщение отредактировал(а) null56 - 13.10.2010, 12:47
PM MAIL   Вверх
mes
Дата 13.10.2010, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(null56 @  13.10.2010,  11:45 Найти цитируемый пост)
       char __THIS_IS_MY_ERROR[eCond]; \
     (void)__THIS_IS_MY_ERROR

это можно также заменить на
Код

typedef char __THIS_IS_MY_ERROR[eCond];


Это сообщение отредактировал(а) mes - 13.10.2010, 12:48


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.