【问题标题】:Cross-platform code label macro?跨平台代码标签宏?
【发布时间】:2015-09-08 23:34:56
【问题描述】:

在 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++ region pragma preprocessor-directive


    【解决方案1】:

    是的,在 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")的并排连接不起作用。

    【讨论】:

    • 这似乎应该可以工作,但无论在哪里使用CODELABEL(MyLabel),MSVC 都会给我error C2059: syntax error : 'string'
    • @RectangleEquals,不用看太远,我认为 _Pragma 不受支持(即使使用 /Za,与 alternative tokens 不同),但它有自己的 __pragma,所以工作。
    • 是的,这种变化似乎起到了作用。不过,尚未在 OSX 中进行测试。
    • @RectangleEquals,如果你是这个意思,我最初的测试是使用 Clang。
    • 是的,Clang。如果您已经使用它进行了测试并且它有效,那么我会说这个案例已经结束。
    【解决方案2】:

    根据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();
    

    【讨论】:

      【解决方案3】:

      就 Windows 和 macOS 而言,从 Xcode 12 和 Visual Studio 2019 开始,您可以轻松使用在两个平台上都可以正常工作的语法:

      #pragma region mark -
      #pragma region mark Whathever Your Label
      

      Xcode 默默地忽略“区域”标记,而 VS 将“标记”标记作为标签的一部分,恕我直言,这是一个小问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多