包含#pragma 的宏定义

dar*_*ts 4 c++ macros

我正在尝试定义以下宏:

#if defined(_MSC_VER)
    #define PRAGMA_PACK_PUSH(n)  __pragma(pack(push, n))
    #define PRAGMA_PACK_POP()    __pragma(pack(pop))
#else
    #define PRAGMA_PACK_PUSH(n)     #pragma (pack(push, n))
    #define PRAGMA_PACK_POP()       #pragma (pack(pop))
#endif
Run Code Online (Sandbox Code Playgroud)

但是我在 Linux 上收到以下错误 -

 error: '#' is not followed by a macro parameter
  #define PRAGMA_PACK_PUSH(n)  #pragma (pack(push, n))
Run Code Online (Sandbox Code Playgroud)

它指向语句中的第一个 ')'

如何定义包含# 的宏?

解决方案更新:

如本线程Pragma 在定义宏中所述,有效的语法是:

#if defined(_MSC_VER)
    #define PRAGMA_PACK_PUSH(n)  __pragma(pack(push, n))
    #define PRAGMA_PACK_POP()    __pragma(pack(pop))
#else
    #define PRAGMA_PACK_PUSH(n)     _Pragma("pack(push, n)")
    #define PRAGMA_PACK_POP()       _Pragma("pack(pop)")
#endif
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 5

如何定义包含# 的宏?

你不能(定义一个包含指令的宏,也就是说。# 仍然可以在宏中用于字符串化,并作为 ## 用于标记连接)。这就是为什么_Pragma在 C99 中被发明和标准化的原因。至于 C++,它肯定在 C++11 标准中,并且可能是后来的标准。

您可以按如下方式使用它:

#define PRAGMA(X) _Pragma(#X)
#define PRAGMA_PACK_PUSH(n)     PRAGMA(pack(push,n))
#define PRAGMA_PACK_POP()       PRAGMA(pack(pop))
Run Code Online (Sandbox Code Playgroud)

接着就,随即,

PRAGMA_PACK_PUSH(1)
struct x{
    int i;
    double d;
};
PRAGMA_PACK_POP()
Run Code Online (Sandbox Code Playgroud)

预处理到

# 10 "pack.c"
#pragma pack(push,1)
# 10 "pack.c"

struct x{
 int i;
 double d;
};

# 15 "pack.c"
#pragma pack(pop)
# 15 "pack.c"
Run Code Online (Sandbox Code Playgroud)

如您所见,_Pragmas 正在扩展为#pragma指令。由于_Pragma是标准的,#ifdef如果 Microsoft 支持,您应该可以避免使用此处。