我正在尝试创建一个宏,以便我可以指定尚未实现的函数(并且在调用时会使程序崩溃)。这是我想到的:
#define NIMPL crash(__PRETTY_FUNCTION__ " not implemented yet")
你会像这样使用它:
void myFunction() {
NIMPL;
}
但是,这种用法会导致此错误:
../feta/include/feta.h:19:41: error: expected ‘)’ before string constant
#define NIMPL crash(__PRETTY_FUNCTION__ " not implemented yet")
^
crash()
是一个函数,它接受一个字符串作为参数,打印出消息,并调用 exit(1)
.
我可以确认__PRETTY_FUNCTION__
单独使用,无需串联即可正常工作。另外,连接两个字符串时不使用 __PRETTY_FUNCTION__
工作正常:"<stuff>""<other stuff>"
。但同时进行这两项操作是行不通的。
我尝试过使用stringizing operator ,但它不起作用(如果它存在于 GCC 中)。
最佳答案
标准 C 和 C++ 提供了“魔术标识符”__func__
,它的作用就好像它是包含当前函数名称的静态 char
数组的名称。 (实际上该值是在 C++ 中实现定义的。)
gcc 作为扩展提供了 __PRETTY_FUNCTION__
,它与 C 的 __func__
相同,并为 C++ 提供了一些附加信息。
这并不能解决您所询问的问题,即字符串文字连接仅适用于字符串文字。
您说您的 crash()
函数采用单个字符串作为参数。
我建议修改crash()
,使其接受两个参数,或者编写一个接受两个参数的新包装函数。然后您可以使用:
#define NIMPL crash(__PRETTY_FUNCTION__, " not implemented yet")
(由于您使用的是 C++,因此可以使用相同的名称重载它。)连接两个字符串留作练习。
您还可以向现有 crash()
函数添加第二个字符串参数,并为其指定默认值 ""
以避免破坏现有调用。
关于c++ - 函数没有实现宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350814/