2015-09-08 2 views
3

В MSVC & C#, #pragma region можно использовать для обозначения кода.
Аналогичным образом, в GCC/Clang, #pragma mark можно выполнить то же самое.Кросс-платформенный код метки макроса?

Можно ли определить один макрос, такой как CODELABEL(label), который будет работать для обоих компиляторов?

В принципе, я хотел бы избежать того, чтобы сделать следующее:

#ifdef _WIN32 
#pragma region Variables 
#else 
#pragma mark Variables 
#endif 
bool MyBool; 
int MyInt; 

#ifdef _WIN32 
#pragma region Methods 
#else 
#pragma mark Methods 
#endif 
void MyMethod(); 
void AnotherMethod(); 

... и вместо этого сделать что-то вроде этого:

CODELABEL(Variables) 
bool MyBool; 
int MyInt; 
CODELABEL(Functions) 
void MyMethod(); 
void AnotherMethod(); 

что-то подобное возможно?

ответ

5

Да, в C++ 11, вы можете использовать _Pragma, поскольку использование #pragma в определении макроса не допускается:

#ifdef _WIN32 
#define PRAGMA(x) __pragma(x) //it seems like _Pragma isn't supported in MSVC 
#else 
#define PRAGMA(x) _Pragma(#x) 
#endif 

#ifdef _WIN32 
#define CODELABEL(label) PRAGMA(region label) 
#else 
#define CODELABEL(label) PRAGMA(mark label) 
#endif 

Танец с PRAGMA, чтобы удовлетворить _Pragma требуя строковым, где сторона (например, "mark" "section label") не работает.

+0

Это кажется, что это должно работать, но MSVC дает мне 'ошибка C2059: синтаксическая ошибка:«string'', где 'CodeLabel (MyLabel)' используется – RectangleEquals

+0

@RectangleEquals , Не заглядывая слишком далеко, я думаю, что '_Pragma' не поддерживается (даже с/Za, в отличие от [альтернативных токенов] (http://stackoverflow.com/a/24414420/962089)), но у него были свои собственные '__pragma', так что работает. – chris

+0

Да, это изменение, похоже, сделало трюк. Тем не менее, не тестировалось в OSX. – RectangleEquals

1

Согласно this topic, следующее должно работать.

#define STR_HELPER(x) #x 
#define STR(x) STR_HELPER(x) 

#ifdef _WIN32 
    #define LABEL region 
#else 
    #define LABEL mark 
#endif 

, а затем

#pragma STR(LABEL) Variables 
bool MyBool; 
int MyInt; 
#pragma STR(LABEL) Functions 
void MyMethod(); 
void AnotherMethod(); 
Смежные вопросы