You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法将字符串字面量与__FUNCTION__进行相邻拼接?

为什么__FUNCTION__不能和字符串字面量直接拼接?

我之前也踩过这个一模一样的坑!你本来以为__FUNCTION__和__FILE__一样是字符串字面量,结果发现没法像__FILE__ "A"那样直接相邻拼接,连cscope都解析不了它,对吧?

先看看你给出的示例代码:

#include <iostream>
int main( int argc, char* argv[] ) {
    std::cout << __FILE__ << std::endl;
    std::cout << __FILE__ "A" << std::endl;
    std::cout << __FUNCTION__ << std::endl;
    //std::cout << __FUNCTION__ "A" << std::endl; // 无法编译
    return 0;
}

启用注释掉的代码行后,用GCC 4.8.3编译会报出这个错误:

main.cpp:8:29: error: expected ';' before string constant
std::cout << FUNCTION "A" << std::endl; // 无法编译的内容

核心原因:__FUNCTION__不是字符串字面量

在C标准里,__FILE__是字符串字面量(属于const char[]类型的字面量),C/C语法本身就允许相邻的字符串字面量自动拼接,所以__FILE__ "A"能正常编译通过。

但__FUNCTION__完全不一样:在C11之前,它是编译器提供的静态字符数组变量(类型是const char[],但属于变量范畴,不是字面量);哪怕C11把它标准化之后,它的本质还是函数作用域内的静态常量字符数组,依然不是字符串字面量。

而C++里只有字符串字面量之间才能直接相邻拼接,变量和字面量这么写属于语法错误,编译器会误以为你漏写了分号或者运算符。

为什么cscope解析不了它?

cscope主要处理源代码里的常规标识符、显式定义的宏,而__FUNCTION__是编译器内置的特殊语法元素(或者说编译器隐式定义的变量),它不是你在代码里显式声明的,也不属于预处理器的普通宏范畴,所以cscope没法识别它的特殊身份,自然解析不了。

解决方法

要实现类似的拼接效果,你可以试试这些方式:

  • 用std::string直接拼接:
    std::cout << std::string(__FUNCTION__) + "A" << std::endl;
    
  • 借助字符串流处理:
    std::stringstream ss;
    ss << __FUNCTION__ << "A";
    std::cout << ss.str() << std::endl;
    
  • 如果想用C风格字符串,需要手动分配空间并拼接:
    char buf[100];
    strcpy(buf, __FUNCTION__);
    strcat(buf, "A");
    std::cout << buf << std::endl;
    

内容的提问来源于stack exchange,提问作者StoneThrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:25:04