Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как создать тип проекта для кроссплатформенных классов

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Как создать тип проекта для кроссплатформенных классов
Имя
Сообщение << Старые топики   Новые топики >>
Как создать тип проекта для кроссплатформенных классов - 2011-08-11 14:17:02.846666   
mavok

Сообщений: 31
Оценки: 0
Присоединился: 2011-08-08 10:52:34.890000
Часто приходиться писать классы имеющие разную реализацию в разных ОС.

В С++ можно макросами задавать участки кода, которые будут включаться в зависимости от типа текущей ОС.

Но этот вариант значительно ухудшает читабельность кода, поэтому я предпочитаю делать свою реализацию класса для каждой ОС.
Для этого я:
1. Первоначально объявляю интерфейс (в C++ класс содержащий только чисто виртуальные методы)
2. Пишу два класса с одинаковым именем реализующих этот интерфейс, но в разных исходниках.
3. Добавляю header который в зависимости от ОС подключает нужный исходник с нужной реализацией класса.

Пример: класс WindowInfo, в нем должна быть статическая функция возвращающая список всех top-level окон.

Тогда, интерфейс будет таким:

#ifndef IWINDOWINFO_DEFINED #define IWINDOWINFO_DEFINED #if defined(_MSC_VER) && (_MSC_VER &gt;= 1020) # pragma once #endif #include &lt;QWidget&gt; #include &lt;QList&gt; class IWindowInfo { public: ~IWindowInfo(){}; virtual const QList&lt;WId&gt; getWindowsList() const = 0; } #endif
Инклудник под Windows WindowInfoWin32.h:
#ifndef WINDOWINFOWIN32_DEFINED #define WINDOWINFOWIN32_DEFINED #if defined(_MSC_VER) && (_MSC_VER &gt;= 1020) # pragma once #endif #include "IWindowInfo.h" class WindowInfo : public IWindowInfo { public: WindowInfo(void); ~WindowInfo(void); const QList&lt;WId&gt; getWindowsList(); }; #endif
Инклудник под Unix WindowInfoUnix.h:
#ifndef WINDOWINFOUNIX_DEFINED #define WINDOWINFOUNIX_DEFINED #if defined(_MSC_VER) && (_MSC_VER &gt;= 1020) # pragma once #endif #include &lt;X11/X.h&gt; #include &lt;X11/Xlib.h&gt; #include &lt;QX11Info&gt; #include &lt;X11/Xatom.h&gt; #include "IWindowInfo.h" class WindowInfo : public IWindowInfo { public: WindowInfo(void); ~WindowInfo(void); const QList&lt;WId&gt; getWindowsList(); }; #endif
Будут WindowInfoWin32.cpp WindowInfoUnix.cpp с реализацией, здесь я их не буду приводить.

Инклудник подключающий нужную реализацию класса WindowInfo.h:
#ifndef WINDOWINFO_DEFINED #define WINDOWINFO_DEFINED #if defined(_MSC_VER) && (_MSC_VER &gt;= 1020) # pragma once #endif #ifdef Q_WS_WIN # include "WindowInfoWin32.h" #else # include "WindowInfoUnix.h" #endif #endif

Соответственно, если где-то в основной программе мне нужно использовать класс WindowInfo, мне не нужно указывать какую конкретно брать реализацию через макросы, а достаточно подключить WindowInfo.h и использовать реализацию интерфейса IWindowInfo.

Так вот теперь суть проблемы:

1. Хотелось бы все эти действия по созданию такого класса автоматизировать.
Создать новый тип проекта, где я бы перечислил бы перечень систем в которых будет реализовываться класс и создавалась бы вся эта большая совокупность файлов.
2. Если я добавляю новый метод в абстрактный класс, чтобы он вставлял прототипы и пустую реализацию во всех платформозависимых реализациях данного класса.

Я слышал что в Visual Studio такие фишки можно делать.

Да, интересует реализация именно Visual Studio.

Надеюсь, я понятен.
Post #: 1
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 16:27:34.703333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Идея интересная. Нам в проекте особо часто такое не надо, поэтому делаем всё руками в соответствии с принятым у нас синтаксисом. Это скорее будет удобно тем, кто фрэймворки пишет.

Если для вас это действительно нужная вещь и вы пишите в MSVS - можете написать свой плагин (визард) для создания классов. Не думаю, что это будет сложно, просто надо будет покурить MSDN по поводу написания расширений для MSVS… только вот дебажить их гемморно очень :)

Вопрос: а зачем вам #pragma once, если выше всё управляется директивами?
Post #: 2
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 16:38:07.643333   
mavok

Сообщений: 31
Оценки: 0
Присоединился: 2011-08-08 10:52:34.890000

quote:

ORIGINAL: _SaZ_

Если для вас это действительно нужная вещь и вы пишите в MSVS - можете написать свой плагин (визард) для создания классов. Не думаю, что это будет сложно, просто надо будет покурить MSDN по поводу написания расширений для MSVS… только вот дебажить их гемморно очень :)


Ок, спасибо, буду рыть в этом направлении.

quote:

Вопрос: а зачем вам #pragma once, если выше всё управляется директивами?


Не знаю, принятый стандарт. Когда я спросил, сказали что это объявление взяли где-то из недр MSVS.
Post #: 3
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 17:03:14.750000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
#pragma работает только в мсвм

А вот это общепринятая кросс-платформенная практика:

#ifndef BLABLA_H
#define BLABLA_H

// Declaration

#endif // BLABLA_H
Post #: 4
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 17:09:55.820000   
mavok

Сообщений: 31
Оценки: 0
Присоединился: 2011-08-08 10:52:34.890000

quote:

ORIGINAL: _SaZ_

#pragma работает только в мсвм

А вот это общепринятая кросс-платформенная практика:

#ifndef BLABLA_H
#define BLABLA_H

// Declaration

#endif // BLABLA_H


В этом наверное и фишка. Чтобы использовать MSVS pragma once когда доступна.
Post #: 5
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 18:27:11.720000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ещё раз - зачем? Она ведь просто дублирует работу макроса… (з.ы. я думал, что в первом посте твой код =).
Это тоже самое, что писать:
int a = 5;
a = 5; // в этом фишка, чтобы наверняка :)
Post #: 6
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-11 22:43:43.310000   
mavok

Сообщений: 31
Оценки: 0
Присоединился: 2011-08-08 10:52:34.890000
Мой код и есть. Есть стандарт заголовков header файлов.

У нас в фирме просто считают, что pragma once лучше define определения. Поэтому если он есть, то лучше его и использовать.

Вот кстати и ответ:

quote:

Применение #pragma once вместо include guard увеличит скорость компиляции во многих случаях благодаря высокоуровневому механизму; компилятор может самостоятельно сравнивать имена файлов или inode'ы без необходимости вызова препроцессора Си для проверки заголовка на наличие #ifndef и #endif.


От сюда: http://ru.wikipedia.org/wiki/Pragma_once
Post #: 7
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-12 03:06:54.183333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: mavok
У нас в фирме просто считают, что pragma once лучше define определения. Поэтому если он есть, то лучше его и использовать.


Объясни в фирме, что у вас в любом случае сначала идёт проверка по #define :), да и не думаю, что существуют такие проекты, в которых это бы существенно влияло на время компиляции. PCH куда больше выигрыш в скорости дают.
Post #: 8
RE: Как создать тип проекта для кроссплатформенных классов - 2011-08-12 09:08:51.140000   
mavok

Сообщений: 31
Оценки: 0
Присоединился: 2011-08-08 10:52:34.890000
Наверное ты прав, я в этом скурпулезно не разбирался.
Post #: 9
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Как создать тип проекта для кроссплатформенных классов







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.