Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 08:11   #1
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию Условная компиляция, GNU против MSVS

Че-то не соображу...

К примеру, нужно объявить TLS.

Некоторые компиляторы хотят, чтобы было так:
Код:
__declspec(thread) int tls_i = 0;
другие, так:
Код:
__thread int tls_i = 0;
Наивно конечно, но хотелось бы не вносить исправления в код, а написать что-то вроде:

Код:
#ifdef  ???GNU_COMPILER
   __thread ...
#else
    #ifdef ???MSVS_COMPILER
        __declspec(thread) ...
    #endif
#endif
Можно конечно TlsAlloc, но хотелось бы на этапе компиляции.
Кто подскажет, как сделать универсально?
EUGY вне форума Ответить с цитированием
Старый 17.12.2012, 09:31   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Код:
#if defined(THIS_COMPILER)
#  define TLS_MACRO(type) __declspec(thread) type
#else
#  define TLS_MACRO(type) __thread type
#endif

TLS_MACRO(int) gVarName = 42;
waleri вне форума Ответить с цитированием
Старый 17.12.2012, 09:58   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Спасибо waleri,
но фишка в том, что не ясно, какие макроопределения присущи разным компилям.
Вроде у mingw такое __GNUG__
Где бы надыбать список?
EUGY вне форума Ответить с цитированием
Старый 17.12.2012, 10:36   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Где бы надыбать список?
В мануалах нужных компиляторов?
waleri вне форума Ответить с цитированием
Старый 17.12.2012, 10:44   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#ifdef __GNUC__
    // 40302 means version 4.3.2.
    //#define GTEST_GCC_VER_ (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
#endif  // __GNUC__

#ifdef _WIN32
    //#define OS_WINDOWS
#endif

#ifdef __linux__
    //ос линукс
#endif

#ifdef _MSC_VER
    //компилятор вижал студии
#endif

#ifdef __MINGW__
    #define MINGW_STUFF
#endif

#ifdef __MINGW32__
    #define MINGW_STUFF
#endif

#ifdef __MVS__
    //
#endif

#if (__GNUC__) || (MINGW_STUFF)
    #define GCC_COMPILER
#endif

#if (_MSC_VER)
    #define VISUAL_STUDIO
#endif
_Bers вне форума Ответить с цитированием
Старый 17.12.2012, 10:58   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Спасибо, коллеги!
Пока пусть будет так:
Код:
#if (!defined(__GNUG__) || defined(_MSC_VER)) && !defined(__thread)
#	define __thread __declspec(thread)
#endif

__thread int tls_i = 0;
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условная компиляция Camaro Chevelle Помощь студентам 0 09.11.2011 14:55
Теория информации. условная энтропия Alkagolik Помощь студентам 1 13.08.2011 12:17
Условная компиляция Arigato Общие вопросы Delphi 7 11.09.2010 07:10
Условная компиляция. Пепел Феникса Общие вопросы Delphi 6 25.05.2010 21:36
Условная операция DEV C+++ edmynt Помощь студентам 1 11.10.2009 15:40