gpt4 book ai didi

c++ - 包含#pragma 的宏定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:45 24 4
gpt4 key购买 nike

我正在尝试定义以下宏:

#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

但我在 Linux 上遇到以下错误 -

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

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

如何定义包含# 的宏?

解决方案更新:

如本帖所述Pragma in define macro有效的语法是:

#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

最佳答案

How can i define a macro that contains a #?

你不能(定义一个包含指令的宏,即。# 仍然可以在宏中用于字符串化和作为 ## 用于标记连接)。这就是 _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))

这样,

PRAGMA_PACK_PUSH(1)
struct x{
int i;
double d;
};
PRAGMA_PACK_POP()

预处理为

# 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"

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

关于c++ - 包含#pragma 的宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45130677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com