宏中的双斜杠命令替换

时间:2012-06-12 19:17:16

标签: c macros c-preprocessor pic conditional-compilation

我正在开发符合ansi标准的编译器(Microchip XC8)上的PIC MCU程序。 有两种操作模式,在编译期间通过宏确定。 因此,由于一行代码,我不想复制一个类似函数的宏,我想知道是否有任何方法可以编写宏,例如

#define FOO //

这样当FOO被替换时,它实际上将取消该线的其余部分。

编写函数而不是宏是不可能的,因为函数调用产生的延迟会破坏程序的紧密时间(大约几微秒)。

4 个答案:

答案 0 :(得分:5)

您可以使用#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++;

答案 1 :(得分:5)

你无法进行宏扩展以注释掉该行,没有。宏定义中的//是定义后面的注释,它没有扩展,IIRC有一条规则说你不能使用令牌粘贴来构造//。即使你可以,扩展它并不意味着宏开始发表评论。基本上,您无法使用宏来更改注释语法。

你可以这样做:

#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__)

答案 2 :(得分:3)

在宏替换发生之前,会从源中删除注释,因此无法完全定义宏。但是,当然可以将一个附加参数传递给宏来指定它应该生成哪个代码,或者根据您要编译的模式有条件地定义宏。

答案 3 :(得分:1)

#define FOO(...) __VA_ARGS__

然后在宏中使用FOO(your code here)而不是FOO your code here

如果您的平台没有C99,则可以使用

#define FOO(x) x

并确保参数不包含,中未包含的()