C++ 函数未实现宏?
我试图创建一个宏,这样我就可以指定一个函数尚未实现(并且在调用时会使程序崩溃)。以下是我的想法:C++ 函数未实现宏?,c++,gcc,C++,Gcc,我试图创建一个宏,这样我就可以指定一个函数尚未实现(并且在调用时会使程序崩溃)。以下是我的想法: #define NIMPL crash(__PRETTY_FUNCTION__ " not implemented yet") 你会这样使用它: void myFunction() { NIMPL; } 但是,此用法会导致以下错误: ../feta/include/feta.h:19:41: error: expected ‘)’ before string constant #def
#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)
我可以确认\uuu PRETTY\u FUNCTION\uuuu
单独运行,而不使用串联。此外,在不使用\uuu PRETTY\u函数的情况下连接两个字符串也可以正常工作:“
”。但同时做这两件事是行不通的
我尝试过使用,但它不起作用(如果它甚至存在于GCC中)。在C中(正如问题最初标记的那样),\uuuu PRETTY\u函数是\uu func\uuuu
的另一个名称,它不是字符串文字。在C++中,它用函数签名来修饰,但它不是字符串文字。
摘自(特别注意最后一句):
标识符\uuuu func\uuuu
由转换器隐式声明,就好像在每个函数定义的左括号后面,声明
static const char __func__[] = "function-name";
出现,其中function name是词汇封闭函数的名称。此名称是函数的未加修饰的名称。作为扩展,在文件(或者,在C++中,命名空间范围),<代码>
…
在C中,“PyTyTyFixFiely”是 > SyfSoffix的另一个名称,除了在文件(或,在C++中,命名空间范围)之外,它还计算为字符串<代码>“顶层”< /代码>。另外,在C++中,<>代码>
…
这些标识符是变量,不是预处理器宏,不能用于初始化char
数组,也不能与字符串文字连接
由于使用C++,您可以考虑将代码>崩溃/>代码定义为一个可变的模板函数而不是宏,以提供更多的灵活性。
void crash_t (std::ostringstream &oss)
{
oss << std::endl;
write(2, &oss.str()[0], oss.str().size());
exit(1);
}
template <typename A, typename... REST>
void crash_t (std::ostringstream &oss, A arg, REST... rest)
{
oss << arg;
crash_t(oss, rest...);
}
template <typename... ARGS>
void crash (ARGS... args)
{
std::ostringstream oss;
crash_t(oss, args...);
}
void崩溃(std::ostringstream&oss)
{
C++中的OSS(由于问题最初是标记的),<>代码> p> PythyIyFrase
是代码< >函数>函数> /COD>,它不是字符串文字。在C++中,它用函数签名来修饰,但它不是字符串文字。
摘自(特别注意最后一句):
标识符\uuuu func\uuuu
由转换器隐式声明,就好像在每个函数定义的左括号后面,声明
static const char __func__[] = "function-name";
出现,其中函数名称是词汇包围函数的名称。这个名称是函数的未命名的名称。作为扩展名,在文件(或C++中,命名空间范围)中,<代码>
…
在C中,<>代码>函数>函数> <代码>是代码> >函数>代码>的另一个名称,除了在文件(或C++中,命名空间范围)之外,它还计算为字符串“顶级”。此外,在C++中,<>代码>
…
这些标识符是变量,不是预处理器宏,不能用于初始化char
数组,也不能与字符串文字连接
由于使用C++,您可以考虑将代码>崩溃/>代码定义为一个可变的模板函数而不是宏,以提供更多的灵活性。
void crash_t (std::ostringstream &oss)
{
oss << std::endl;
write(2, &oss.str()[0], oss.str().size());
exit(1);
}
template <typename A, typename... REST>
void crash_t (std::ostringstream &oss, A arg, REST... rest)
{
oss << arg;
crash_t(oss, rest...);
}
template <typename... ARGS>
void crash (ARGS... args)
{
std::ostringstream oss;
crash_t(oss, args...);
}
void崩溃(std::ostringstream&oss)
{
OS标准C和C++提供了“魔术标识符”< C++ >函数>代码>,它的名字是静态的<代码> char < /C>数组,包含当前函数的名称(实际上值是C++中定义的实现)< /p>
GCC作为扩展,提供了代码>函数>代码>,与C的代码> >函数>代码>相同,并为C++提供了一些附加信息。
这并不能解决您所问的问题,即字符串文字连接只适用于字符串文字
您可以说您的crash()
函数将单个字符串作为参数
我建议修改crash()
,使其包含两个参数,或者编写一个包含两个参数的新包装函数。然后可以使用:
#define NIMPL crash(__PRETTY_FUNCTION__, " not implemented yet")
(由于使用C++,可以用相同的名称重载它)。将两个字符串串联起来作为练习。
您还可以向现有的<代码> CRASH()/C++函数中添加第二个字符串参数,并赋予它一个默认值“代码>”“/CODE”,以避免中断现有的调用。< C++ >函数> <代码>,它的名字是静态的<代码> char 数组,包含当前函数的名称(实际上值是C++中定义的实现)
GCC作为扩展,提供了代码>函数>代码>,与C的代码> >函数>代码>相同,并为C++提供了一些附加信息。
这并不能解决您所问的问题,即字符串文字连接只适用于字符串文字
您可以说您的crash()
函数将单个字符串作为参数
我建议修改crash()
,使其包含两个参数,或者编写一个包含两个参数的新包装函数。然后可以使用:
#define NIMPL crash(__PRETTY_FUNCTION__, " not implemented yet")
(由于使用C++,可以用相同的名称重载它)。将两个字符串串联起来作为练习。
您还可以向现有的crash()
函数添加第二个字符串参数,并将其默认值设置为”
,以避免中断现有调用。对于C,您最好使用\uuuuu func\uu
,这与\uu PRETTY\u function\uuuu
不同_