__COUNTER__ эквивалент на Xcode? - PullRequest
3 голосов
/ 28 июня 2010

Я мигрирую проект из Linux в Xcode, и я столкнулся с проблемой «версии».

Мне нужен уникальный идентификатор во время компиляции для моего динамического материала, в Linux я использовал препроцессор __ COUNTER__, но кажется, что gcc 4.2, используемый в XCode, еще не знает о __COUNTER__ ...
Итак, мне было интересно, что я мог бы сделать, чтобы решить эту проблему?
Я могу обновить GCC до 4.3 (чтопонимает ___ COUNTER__), используя macports.org или что-то в этом роде ... Я очень ноб в OSX и не очень хорош в linux = [
или нахожу другой способ добиться этого, в данном случае, метод длядать функции / переменной уникальный идентификатор.Я пробовал с __LINE__, но через несколько дней вы в конечном итоге объявляете материал на одной и той же строке в разных файлах, и игра с этим просто не столь продуктивна ...

Любая помощь приветствуется!

Спасибо,
Джонатан

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Мне нужно каталогизировать все классы, используемые в проекте, чтобы эти классы могли быть созданы на лету из фабрики [...]

Если не использовать RTTI (которыйНеплохая идея, если вам разрешено это делать; boost :: any делает это), как насчет использования строки для имен классов?Вы можете получить это с помощью макроса.

#include <iostream>
#include <string>
using namespace std;

template <class T>
const char* my_type_id()
{
    return "Unknown";
}

#define REGISTER_TYPE(some_type)            \
    template <> inline                      \
    const char* my_type_id<some_type>()     \
    {                                       \
        return #some_type;                  \
    }

REGISTER_TYPE(int)
REGISTER_TYPE(std::string)

int main()
{
    // displays "int"
    cout << my_type_id<int>() << endl;

    // displays "std::string"
    cout << my_type_id<string>() << endl;

    // displays "Unknown" - we haven't registered char
    cout << my_type_id<char>() << endl;
}

Самым приятным в этом подходе является то, что вам не нужно беспокоиться о проблемах между единицами перевода или модулями в этом подходе.Единственное, что вы должны остерегаться - это конфликты имен, в этом случае вы можете указать пространство имен, чтобы избежать их (например, "std :: string", а не просто "string").

Мы используемэто решение в качестве альтернативы для boost :: any, которое мы предоставляем через наш SDK (и поэтому не можем использовать boost, так как это потребовало бы, чтобы у наших пользователей была установлена ​​boost, или чтобы мы отправляли части boost в случае чего это может привести к конфликтамдля пользователей, у которых установлены разные версии boost).Он не такой автоматический, как boost :: any, так как требует ручной регистрации поддерживаемых типов (в этом отношении ближе к boost :: variable), но не требует от наших пользователей SDK включения RTTI и работает переносимо через границы модуля (I 'я не уверен, можно ли полагаться на RTTI для получения одной и той же информации в разных компиляторах, настройках и модулях - я сомневаюсь в этом).

Теперь вы можете использовать эти идентификаторы строк, связанные с типом, как вам угодно.Одним из примеров может быть использование его для сопоставления функций создания с этими строковыми идентификаторами, чтобы вы могли создать экземпляр std :: string, например, через factory :: create ("std :: string");Обратите внимание, что это гипотетический случай только для демонстрационных целей, поскольку использование фабрики для создания std :: string было бы довольно странным.

0 голосов
/ 03 июля 2010

@ stinky472: я использую код, близкий к тому, что вы написали выше ...

Моя проблема заключалась в том, что я использовал макрос для объявления пространств имен проекта, поэтому, имея полное имя класса, как класс c, находится в a :: b :: c.
То, что я сделал, изменило мой код, чтобы он не полагался на сами пространства имен, а добавил новый аргумент в объявлении макроса класса, чтобы сказать, какое пространство имен он использует, например:

newclass (a :: b, c): public d {

};

Моя проблема с счетчиком состояла в том, что пространства имен использовались во многих классах, таким образом, создавая одно и то же имя переменной в макросах пространств имен, и, используя новый способ, описанный выше, мне больше не нужен счетчик ...

спасибо за помощь,
Jonathan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...