Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Август 25, 2012, 14:09



Название: QString и #define
Отправлено: virtual_root от Август 25, 2012, 14:09
Добрый день. Наверняка, кто-то уже сталкивался с похожей проблемой, подскажите пожалуйста её решение.
У меня в файле config.h объявлены константы:
Код
C++ (Qt)
#ifndef CONFIG_H
#define CONFIG_H
#include <QDir>
 
#define QUOTE(DB_PATH)  = qApp->applicationDirPath()+ QDir::separator();
#define QUOTE(string) DB_NAME = "QBook.sqlite";
 
#endif // CONFIG_H
В другом файле я пытаюсь их использовать(подключила config.h)
Код
C++ (Qt)
QString locationDB(QUOTE(DB_PATH));
но ничего не выходит.. компилятор ругается:
Код:
 ошибка: 'DB_NAME' was not declared in this scope
 ошибка: expected primary-expression before ')' token
 ошибка: expected ';' before ')' token


Название: Re: QString и #define
Отправлено: virtual_root от Август 25, 2012, 14:14
пробовала так:
Код
C++ (Qt)
#ifndef CONFIG_H
#define CONFIG_H
#include <QDir>
 
#define DB_PATH = qApp->applicationDirPath()+ QDir::separator();
#define DB_NAME = "QBook.sqlite";
 
#endif // CONFIG_H
 
Код
C++ (Qt)
   const char *c = DB_PATH;
но всё равно ругается..


Название: Re: QString и #define
Отправлено: kambala от Август 25, 2012, 14:46
мда… учить язык надо, на котором пишешь.
Код
C++ (Qt)
#define DB_PATH (qApp->applicationDirPath() + QDir::separator()) // скобки вокруг на всякий случай, чтобы выражение было единым целым
#define DB_NAME "QBook.sqlite"
но вообще использование макросов в С++ является плохим тоном. лучше написать так:
Код
C++ (Qt)
static const QString kDbName("QBook.sqlite");
 
QString dbPath() { return qApp->applicationDirPath() + QDir::separator(); }
функцию пути в принципе можно написать даже так:
Код
C++ (Qt)
const QString &dbPath()
{
   static QString path;
   if (path.isEmpty())
       path = qApp->applicationDirPath() + QDir::separator();
   return path;
}


Название: Re: QString и #define
Отправлено: Igors от Август 25, 2012, 15:15
Чем меньше макросов - тем лучше, там много ловушек. Простой пример

Код
C++ (Qt)
qreal x2 = point.x() * point.x();   // длинновато
 
#define SQR(a) (a * a)
qreal x2 = SQR(point.x());   // так короче
 
Где ошибка?


Название: Re: QString и #define
Отправлено: virtual_root от Август 25, 2012, 15:21
а оно скомпилировалось без ошибок


Название: Re: QString и #define
Отправлено: Igors от Август 25, 2012, 15:28
а оно скомпилировалось без ошибок
А работать будет?  :)


Название: Re: QString и #define
Отправлено: andrew.k от Август 25, 2012, 16:24
а оно скомпилировалось без ошибок
А работать будет?  :)
Будет, но не всегда так, как надо)

Код
C++ (Qt)
#define SQR(a) ((a) * (a))