【发布时间】:2017-12-21 04:34:21
【问题描述】:
我正在尝试定义以下宏:
#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
【问题讨论】:
-
VS可以处理
#pragma的语法就好了,你为什么要用__pragma呢?随处使用#pragma。 -
@VTT 不在定义内!
-
-
@VTT 定义在这里,因为一遍又一遍地编写 _pragma(pack(push, n)) 或 __pragma(pack(pop)) 很痛苦。它用于快捷方式
-
@darkThoughts 这些宏只短了 6 个符号,考虑到您需要在定义这些宏的位置添加 #include 标头,它似乎并没有节省太多(如果有的话)。