没有空格的C ++宏

时间:2011-08-17 08:42:17

标签: c++ macros space comments

我需要一个宏来扩展为c ++注释,这可能吗?

我有这个:

#define SLASH(x,y) x y
#define OUT SLASH(/,/)

int main(int argc, char *argv[])
{
  OUT << "text";
  return 0;
}

需要扩展到这个:

{
  // << "text";
  return 0;
}

我也试过这个:

#define SLASH(x) /x
#define OUT SLASH(/)

但结果仍然相同:

int main(int argc, char *argv[])
{
  / / << "text";
  return 0;
}

5 个答案:

答案 0 :(得分:5)

不,这是不可能的,因为在扩展宏之前,C ++注释被删除了。

(参见标准2.1,第3阶段的评论删除,第4阶段的宏观扩展。)

答案 1 :(得分:2)

用一个什么都不做的函数对象替换它呢?

static class NullOutput { 
public:
    template <typename T> 
    const NullOutput &operator<<(T arg) const { 
        return *this; 
    }
} NullOutputObj;

#define OUT NullOutputObj

最终结果是从代码中删除了对象,并将其替换为内联模板扩展,然后在不执行任何操作时对其进行优化。结果绝对没有代码开销。

答案 2 :(得分:1)

在预处理器运行之前,会从源代码中删除注释。所以你不能这样做。

答案 3 :(得分:1)

正如其他人所说,没有保证可以定义您正在寻找的宏类型。实现与您尝试实现的结果类似的结果的其他方法是将输出语句包装在条件块中或定义仅丢弃所有输出的自定义输出流。这两种方法甚至可以组合在一起,以便通过更改单个宏定义来切换行为。

答案 4 :(得分:0)

您希望实现的目标是:

http://donjaffer.blogspot.in/2012/09/dprintf-debug-macro-in-c.html

#define DEBUG   // comment if you do not want the debug statments to appear.

#ifdef DEBUG
#define DPRINTF(fmt, ...) \
    do { printf("my_file: " fmt, ## __VA_ARGS__); } while (0)
#else
#define DPRINTF(fmt, ...) \
    do { } while (0)
#endif

无论您何时尝试打印语句,而不是COUT&lt;&lt;你可以用

DPRINTF("Your text here\n");