Макрос кросс-платформенной метки кода?

В 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();

Возможно ли что-то подобное?

4

Решение

Да, в 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") не работает.

5

Другие решения

В соответствии с Эта тема, следующее должно работать.

#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();
1

По вопросам рекламы [email protected]