我正在一个符合 ansi 标准的编译器(Microchip XC8)上开发一个 PIC MCU 程序。有两种操作模式,在编译期间通过宏确定。所以我不想因为一行代码而复制一个类似函数的宏,我想知道是否有任何方法可以编写宏,例如
#define FOO //
这样当 FOO 被替换时,它实际上会取消该行的其余部分。
编写函数而不是宏是不可能的,因为函数调用产生的延迟会破坏我程序的紧张时间(大约几微秒)。
我正在一个符合 ansi 标准的编译器(Microchip XC8)上开发一个 PIC MCU 程序。有两种操作模式,在编译期间通过宏确定。所以我不想因为一行代码而复制一个类似函数的宏,我想知道是否有任何方法可以编写宏,例如
#define FOO //
这样当 FOO 被替换时,它实际上会取消该行的其余部分。
编写函数而不是宏是不可能的,因为函数调用产生的延迟会破坏我程序的紧张时间(大约几微秒)。
您不能使宏扩展以注释掉该行,不。//
在宏定义中是定义之后的注释,它没有被扩展,并且 IIRC 有一条规则说你不能构造一个//
using 标记粘贴。即使可以,扩展它也不意味着宏开始注释。基本上,您无法使用宏更改注释语法。
你可以这样做:
#if DO_NOTHING_MODE
#define FOO(ARG1)
#else
#define FOO(ARG1) ARG1
#endif
并像这样使用它:
#define FUNCTION_LIKE_MACRO(ARG1, ARG2) \
required line; \
FOO(optional line;) \
尽管更常见的习惯用法是将宏设计为接受表达式作为其参数,而不是整行:
#if DO_NOTHING_MODE
#define FOO(ARG1) ((void)0)
#else
#define FOO(ARG1) (ARG1)
#endif
并像使用它一样FOO(optional line);
无论哪种方式,如果宏参数中包含逗号,则调用者需要将它们括在括号中FOO((1,2))
,尽管在 C99 中您可以通过制作FOO
可变参数宏来避免这种情况:
#define FOO(...) (__VA_ARGS__)
您可以使用该#ifndef
指令来实现相同的效果:
#ifndef FOO
your_line_of_code
#endif
编辑:@SteveJessop 让我看到我没有注意 OP 的这句话“我不想因为一行代码而复制一个类似函数的宏”。如果不需要复制类似函数的宏,则在这种情况下可以执行以下操作:
// When FOO is defined, BLA in FUNC macro is a no-operation (null statement)
#ifndef FOO
#define BLA() a++
#else
#define BLA()
#endif
#define FUNC() \
BLA(); \
b++;
在宏替换发生之前,注释会从源代码中删除,因此无法完全定义这样的宏。但是,当然可以将附加参数传递给宏以指定它应该生成的代码,或者根据您正在编译的模式有条件地定义宏。
#define FOO(...) __VA_ARGS__
然后在宏中使用FOO(your code here)
而不是。FOO your code here
如果您的平台没有 C99,您可以改用
#define FOO(x) x
并确保参数不包含,
未包含在()
.