【问题标题】:Concatenating proprocessor macro __FUNCTION__ with a string将处理器宏 __FUNCTION__ 与字符串连接起来
【发布时间】:2017-03-30 11:14:36
【问题描述】:

这应该是微不足道的,但我似乎无法弄清楚如何将 __FUNCTION__ 与字符串连接起来,尤其是在 GCC 上——尽管它适用于 VC++(我正在将一些代码移植到 Linux)

#include <iostream>
#include <string>

#define KLASS_NAME  "Global"

int main()
{
    std::string msg = KLASS_NAME "::" __FUNCTION__;
    std::cout << msg << std::endl;
}

Online VC++ version

GCC 错误信息

Test.cpp:9:36: error: expected ‘,’ or ‘;’ before ‘__FUNCTION__’
  std::string msg = KLASS_NAME "::" __FUNCTION__;

更新

感谢 Chris,显然相邻的字符串文字是连接的 [reference]。所以VC++在这种情况下可能是正确的,直到你认为__FUNCTION__是非标准的。

【问题讨论】:

  • gcc 有什么错误?
  • 值得注意的是,__FUNCTION__ 不是标准的,__func__ 不是字符串文字。
  • 使用字符串化操作符 '##' #define cocat(a,b) a##b
  • @AliAkberFaiz,这是连接运算符,需要生成有效的令牌。
  • 如果KLASS_NAME "::" __FUNCTION__ 无效,为什么VC++ 甚至接受它?我假设它不是。

标签: c++ c-preprocessor c++03


【解决方案1】:

您需要一个连接运算符并显式构造字符串以便找到正确的连接运算符:

#include <iostream>
#include <string>

#define KLASS_NAME  "Global"

int main()
{
    std::string msg = std::string(KLASS_NAME) + "::" + __FUNCTION__;
    std::cout << msg << std::endl;
}

现场示例:http://ideone.com/vn4yra

【讨论】:

    猜你喜欢
    • 2023-01-24
    • 2017-04-17
    • 2022-12-11
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多