为什么不能将字符串文字连接到__FUNCTION__?

时间:2018-01-06 06:47:17

标签: c++ macros c-preprocessor

不是__FUNCTION__一个字符串文字吗?我总是认为它是 - 沿着__FILE__的路线,但我发现我不能将字符串文字连接起来。如果它不是字符串文字,它定义为什么?我无法通过cscope解决它。

E.g。

#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; // Doesn't compile.
  return 0;
}

包含问题行时的错误:

>g++ --version
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

>g++ -g main.cpp 
main.cpp: In function 'int main(int, char**)':
main.cpp:8:29: error: expected ';' before string constant
   std::cout << __FUNCTION__ "A" << std::endl; // Doesn't compile.

3 个答案:

答案 0 :(得分:7)

  

__FUNCTION__不是字符串文字吗?

没有

来自https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Function-Names.html

  

这些标识符是变量,而不是预处理器宏,并且不能用于初始化char数组或与字符串文字连接。

答案 1 :(得分:2)

简短回答,不,__FUNCTION__不是字符串文字,它是指向包含函数名称的const char *变量的指针。

因为__FUNCTION__宏没有直接扩展到函数名,而是扩展为类似的东西(确切的名称可能不同,但名称存储为char *的指针):

 const char *func_name = "main";

 std::cout << func_name << std::endl;

当然,如果你有这个代码,很容易看到:

 std::cout << func_name "A" << std::endl;

不会编译。

答案 2 :(得分:0)

正如其他人所解释的,__FUNCTION__是指向const char *的指针。知道这一点,如果您需要将__FUNCTION__与任何东西连接起来,就可以在另一个宏上使用它(假设您已经在代码中包含了<string>)。

#define FUNCTION_WITH_PARENTHESIS std::string() + __FUNCTION__ + "()"