c++ - 函数没有实现宏?

标签 c++ gcc

我正在尝试创建一个宏,以便我可以指定尚未实现的函数(并且在调用时会使程序崩溃)。这是我想到的:

#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/

相关文章:

c++ - std::tuple<> 中的参数包装然后应用

c++ - 将旧的 Opencv 代码转换为新的 C++ API,替代 cvGetSubRect?

c - 在 mac os 上将两个变量名相乘

c++ - 为什么行在 gcov 中声明为 'containing no code'

c - 64位机器上什么时候64位指针只使用低32位?

javac 相当于 "-D"?

c++ - 如何从 python 程序调用 C++ 对象中定义的函数?

c++ - #define/#undef 是具有特殊含义的标识符的未定义行为吗?

c++ - 正在释放的指针未分配给所有对象的问题!

c++ - 为什么我不能在 c++0x 的 lambda 中声明一个结构变量?