我正在尝试定义以下宏:
#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
答案 0 :(得分:4)
如何定义包含#?
的宏
你不能(定义一个包含指令的宏,即。#仍然可以在宏中用于字符串化,而##用于令牌连接)。这就是_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
。