В 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();
Возможно ли что-то подобное?
Да, в 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"
) не работает.
В соответствии с Эта тема, следующее должно работать.
#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();