跨平台的代码标签宏?

5
在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();

这样的事情有可能吗?
3个回答

6

在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")无法正常工作。

这似乎应该可以工作,但是 MSVC 在使用 CODELABEL(MyLabel) 的地方给出了 error C2059: syntax error : 'string' - RectangleEquals
@RectangleEquals,不用深入研究,我认为"_Pragma"是不支持的(即使使用/Za,与替代标记不同),但它有自己的"__pragma",所以可以使用。 - chris
是的,那个更改似乎起作用了。不过还没有在OSX上测试。 - RectangleEquals
@RectangleEquals,我的初始测试是使用Clang进行的,如果你指的是那个的话。 - chris
是的,Clang。如果你已经测试过并且它可以工作,那么我会说这个案例已经关闭了。 - RectangleEquals

1
根据这个主题,以下内容应该有效。
#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();

0
就 Windows 和 macOS 而言,自从 Xcode 12 和 Visual Studio 2019 开始,你可以轻松使用这种在两个平台上都有效的语法:
#pragma region mark -
#pragma region mark Whathever Your Label

Xcode 在沉默中忽略了 'region' 标记,而 VS 则将 'mark' 标记视为标签的一部分,这是一个次要的美观问题,我个人认为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接