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
不同_