前向声明的替代方案
Alternative to forward declaration
我注意到 将 class
或 struct
关键字添加到需要前向声明的类型之前 就好像该类型是前向声明的一样:
// 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);
这是合法的,但可能不是一个好主意。
来自[basic.scope.pdecl]/6:
[...] — for an elaborated-type-specifier of the form
class-key identifier
if the elaborated-type-specifier is used in the decl-specifier-seq or parameter-declaration-clause of a
function defined in namespace scope, the identifier is declared as a class-name in the namespace that
contains the declaration [...]
例如:
namespace mine {
struct T* foo(struct S *);
// ^^^^^^^^^---------------- decl-specifier-seq
// ^^^^^^^^^^--- parameter-declaration-clause
}
这将 T
和 S
作为 class 名称和 foo
作为函数名称引入 namespace mine
。
请注意,C 中的行为不同;结构名称仅在函数范围内有效。
6.2.1 Scopes of identifiers
4 - [...] If the declarator or type specifier that
declares the identifier appears [...] within the list of parameter declarations in
a function definition, the identifier has block scope, which terminates at the end of the
associated block. If the declarator or type specifier that declares the identifier appears
within the list of parameter declarations in a function prototype (not part of a function
definition), the identifier has function prototype scope, which terminates at the end of the
function declarator.
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
我注意到 将 class
或 struct
关键字添加到需要前向声明的类型之前 就好像该类型是前向声明的一样:
// 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);
这是合法的,但可能不是一个好主意。
来自[basic.scope.pdecl]/6:
[...] — for an elaborated-type-specifier of the form
class-key identifier
if the elaborated-type-specifier is used in the decl-specifier-seq or parameter-declaration-clause of a function defined in namespace scope, the identifier is declared as a class-name in the namespace that contains the declaration [...]
例如:
namespace mine {
struct T* foo(struct S *);
// ^^^^^^^^^---------------- decl-specifier-seq
// ^^^^^^^^^^--- parameter-declaration-clause
}
这将 T
和 S
作为 class 名称和 foo
作为函数名称引入 namespace mine
。
请注意,C 中的行为不同;结构名称仅在函数范围内有效。
6.2.1 Scopes of identifiers
4 - [...] If the declarator or type specifier that declares the identifier appears [...] within the list of parameter declarations in a function definition, the identifier has block scope, which terminates at the end of the associated block. If the declarator or type specifier that declares the identifier appears within the list of parameter declarations in a function prototype (not part of a function definition), the identifier has function prototype scope, which terminates at the end of the function declarator.
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