预处理字符串连接

时间:2019-05-10 09:10:37

标签: c++ macros c-preprocessor

我想通过在其后使用std :: setw()将以下3个字符串连接起来以产生良好的调试输出。

  

__ FILENAME__,“:”和 LINE

#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

#define AT __FILENAME__ ":" __LINE__

#ifdef DEBUG
    #ifdef VERBOSE
       #define printDebug(x) std::cout << AT << x << std::flush
    #else
       #define printDebug(x) std::cout << x << std::flush
    #endif
#else
    #define printDebug(x)
#endif

但是实际上我收到错误消息,说“;” “:”之前缺少该字段。有人有主意吗?

我实际上这样调用printDebug()函数:

printDebug("[SUCCESS] Receiving Message");

1 个答案:

答案 0 :(得分:2)

您可以将字符串文字并置在一起。

":"是字符串文字。

__LINE__扩展为数字文字,而不是字符串1。

__FILENAME__根本不会扩展为文字。它扩展为一个表达式。

有一种方法可以从__LINE__中获取字符串文字,但是不能将__FILENAME__用作字符串文字。


这里根本不需要使用文字连接。您可以简单地做到这一点:

#ifdef VERBOSE
#define printDebug(x) std::cout << __FILENAME__ << ":" << __LINE__ << x << std::flush