Russian Qt Forum
Май 06, 2024, 02:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: define и единици трансляции  (Прочитано 4351 раз)
stima
Гость
« : Январь 26, 2012, 19:32 »

Хочу сделать что-то наподобии такого:
Код:
----A.h-----
#ifndef A
#define A

#include <Debug>

class A {
    public:
        static void foo(const QString& str);
}

#endif
-------------
------A.cpp-------

void A::foo(const QString& str)
{
   bool empty = str.IsEmpty();

#ifdef PPRINT
    if ( empty ) qDebug() << "Warning: empty";
#else
    Q_ASSERT_X(!empty, "A", "empty str");
#endif

    //....some logic....
}
---------
--------main.cpp--------

#define PRINT
#include "A.h"

int main()
{
    A::foo("");

    return 0;
}
-------

Но постоянно срабатывает ассерт, то есть моего дефайна не видно. Как сделать правильно?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Январь 26, 2012, 20:21 »

в .pro файле дописать QMAKE_CXX_FLAGS += -DPRINT

ну и в коде использовать не PPRINT а PRINT Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
mutineer
Гость
« Ответ #2 : Январь 26, 2012, 20:49 »

Ты надеешься на то, что препроцессор сначала пройдет по main.cpp, а затем по A.cpp
А где гарантия что он так сделает?
Записан
twp
Гость
« Ответ #3 : Январь 26, 2012, 21:38 »

в .pro файле дописать QMAKE_CXX_FLAGS += -DPRINT

ну и в коде использовать не PPRINT а PRINT Улыбающийся
есть же DEFINES
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Январь 26, 2012, 21:44 »

в .pro файле дописать QMAKE_CXX_FLAGS += -DPRINT

ну и в коде использовать не PPRINT а PRINT Улыбающийся
есть же DEFINES
буду знать, спасибо
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Disa
Гость
« Ответ #5 : Январь 27, 2012, 09:03 »

Взято с гугл стайл гайда по опенсурсным проектам:
Цитировать
Be very cautious with macros. Prefer inline functions, enums, and
const variables to macros:

Macros mean that the code you see is not the same as the code the compiler sees.
This can introduce unexpected behavior, especially since macros have global scope.

Luckily, macros are not nearly as necessary in C++ as they are in C.
Instead of using a macro to inline performance-critical code, use an
inline function. Instead of using a macro to store a constant, use a
const variable. Instead of using a macro to "abbreviate" a long variable
name, use a reference. Instead of using a macro to conditionally compile code ...
well, don't do that at all (except, of course, for the #define guards to
prevent double inclusion of header files). It makes testing much more difficult.

Macros can do things these other techniques cannot, and you
do see them in the codebase, especially in the lower-level libraries.
And some of their special features (like stringifying, concatenation, and so forth)
are not available through the language proper. But before using a macro,
consider carefully whether there's a non-macro way to achieve the same result.

The following usage pattern will avoid many problems with macros;
if you use macros, follow it whenever possible:

Don't define macros in a .h file.
#define macros right before you use them, and #undef
them right after.
Do not just #undef an existing macro before replacing
it with your own; instead, pick a name that's likely to be
unique.
Try not to use macros that expand to unbalanced C++ constructs,
or at least document that behavior well.
Prefer not using ## to generate function/class/variable names.

И еще:
Цитировать
Явный вызов конструктора требуется только в крайне редких случаях.
В обычном программировании, явный вызов конструктора, как правило,
появляется из-за желания сокращения размера кода. Не надо этого делать!
Создайте обыкновенную функцию инициализации.
Пруфлинк

Хотя ,конечно, можно долго спорить по поводу обоих правил. Улыбающийся
« Последнее редактирование: Январь 27, 2012, 09:05 от Disa » Записан
stima
Гость
« Ответ #6 : Январь 27, 2012, 11:08 »

Омфг, Disa читай больше книг, там все прекрасно расписано. И еще, идея заключалась в другом, позволить клиенту, из разных единиц трансляции использовать или не использовать assert. Но походу ему придеться это делать в обьвлении класса.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #7 : Январь 27, 2012, 12:41 »

а что такое "единица трансляции"?

по поводу задания макросов тебе уже ответили выше - используй DEFINES (ну или QMAKE_CXX_FLAGS).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Disa
Гость
« Ответ #8 : Январь 27, 2012, 13:02 »

Я ничего оспаривать не буду Улыбающийся
Своим постом я хотел сказать, что вообще мало кто может проследить и просчитать работу препроцессора, в отличии от работы компилятора (которую ,конечно, тоже трудно проследить, но предположения делать проще).

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Январь 28, 2012, 11:17 »

>>а что такое "единица трансляции"?
это то, что кушает компилятор, обычно - cpp-файл и всё что в него включается (include).
Записан

Юра.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.