为何无法将字符串字面量与__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

