宏观中的双斜线评论替代

And*_*ros 2 c macros conditional-compilation pic c-preprocessor

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

#define FOO //
Run Code Online (Sandbox Code Playgroud)

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

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

oua*_*uah 5

您可以使用该#ifndef指令来实现相同的效果:

#ifndef FOO
   your_line_of_code
#endif
Run Code Online (Sandbox Code Playgroud)

编辑:@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++;
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 5

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

你可以这样做:

#if DO_NOTHING_MODE
    #define FOO(ARG1)
#else
    #define FOO(ARG1) ARG1
#endif
Run Code Online (Sandbox Code Playgroud)

并使用它像:

#define FUNCTION_LIKE_MACRO(ARG1, ARG2) \
    required line; \
    FOO(optional line;) \
Run Code Online (Sandbox Code Playgroud)

虽然更常见的习惯是将宏设计为接受表达式作为其参数,而不是整行:

#if DO_NOTHING_MODE
    #define FOO(ARG1) ((void)0)
#else
    #define FOO(ARG1) (ARG1)
#endif
Run Code Online (Sandbox Code Playgroud)

并使用它 FOO(optional line);

无论哪种方式,如果宏参数中有逗号,那么调用者需要将它们括在括号中FOO((1,2)),尽管在C99中你可以通过制作FOO一个可变参数宏来避免这种情况:

#define FOO(...) (__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)