替代远期申报

Alternative to forward declaration

本文关键字:      更新时间:2023-10-16

我注意到classstruct关键字前置到需要前向声明的类型就像该类型已前向声明一样工作:

// struct Test; forward declaration commented
void* foo(struct Test* t) // C style function parameter - This works !
{
    return t; 
}

我不知道那件事。我想知道它是标准的c++还是扩展,以及参数之前的struct关键字是否作为前向声明或其他机制启动。

而且,在这种用法之后,"next"函数可以使用该类型而不附加任何关键字:

void* oof(Test* t);

这是合法的,但可能不是一个好主意。

从<<p> strong> [basic.scope.pdecl] /6:

[…-用于
形式的详细类型说明符类关键标识符
如果在a的decl- specific -seq参数声明子句中使用了详细类型说明符在命名空间作用域中定义的函数,标识符在命名空间中声明为类名包含声明[…]

例如:

namespace mine {
    struct T* foo(struct S *);
//  ^^^^^^^^^---------------- decl-specifier-seq
//                ^^^^^^^^^^--- parameter-declaration-clause
}

TS作为类名,将foo作为函数名引入namespace mine


注意C中的行为是不同的;结构名只在函数的作用域中有效。

6.2.1标识符的作用域

4 -[…]如果声明符或类型说明符声明标识符出现[…]中的参数声明列表中的在函数定义中,标识符具有块作用域,该作用域终止于块有关。如果出现了声明该标识符的声明符或类型说明符在函数原型的参数声明列表中(不是函数的一部分)定义)时,标识符具有函数原型作用域,该作用域终止于函数声明符。

gcc对C代码中的这种用法给出了适当的警告:

a.c:3:18: warning: ‘struct Test’ declared inside parameter list
 void* foo(struct Test* t)
                  ^
a.c:3:18: warning: its scope is only this definition or declaration, which is probably not what you want
相关文章:
  • 没有找到相关文章