我在头文件中找到了以下代码,而“BOOT”类在另一个头文件中定义。
class BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)
它看起来像一个函数的声明,但它以class.
Ren*_*ann 36
这是一个详细的类型说明符:
精心设计的类型说明符可用于引用先前声明的类名(类、结构或联合)或先前声明的枚举名称,即使该名称被非类型声明隐藏。它们也可用于声明新的类名。
https://en.cppreference.com/w/cpp/language/elaborated_type_specifier
取自 Artefacto 和 dfrib 的答案,因为它指出了这一点:它相当于:
class BOOT;
BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)
在您的示例中,如果尚不知道,它本质上会执行 BOOT 类的前向声明。struct Data* Data;从同一页面查看此示例:
struct Node {
struct Node* Next; // OK: lookup of Node finds the injected-class-name
struct Data* Data; // OK: declares type Data at global scope
// and also declares the data member Data
friend class ::List; // error: cannot introduce a qualified name
enum Kind* kind; // error: cannot introduce an enum
};
Data* p; // OK: struct Data has been declared
Run Code Online (Sandbox Code Playgroud)
Art*_*cto 21
它与此相同:
class BOOT;
BOOT* boot(void);
Run Code Online (Sandbox Code Playgroud)
所以它是一个指向 的指针class BOOT,但也带有类的声明。此时不需要定义类。
eer*_*ika 13
“class classname* funcname(void)”在 C++ 中是什么意思?
它是一个函数声明。
它看起来像一个函数的声明,但它以“类”开头。
class classname*是函数的返回类型。class classname是一个详细的类型说明符。
在 C++ 中,你可以声明一个函数类型,它的返回类型包含一个在别处定义的类类型,只要你在函数声明之前显式地向前声明类类型:
class BOOT;
BOOT* boot();
Run Code Online (Sandbox Code Playgroud)
但您也可以将前向声明内嵌在函数声明中:
class BOOT* boot();
Run Code Online (Sandbox Code Playgroud)
这是可以使用前向声明的地方之一,可能有点出乎意料。另一个例子是类型模板参数的模板参数列表:
template<typename T>
struct Identity { using type = T; };
using IdentityBoot = Identity<struct BOOT>;
// ^^^^^^^^^^^ also a forward declaration
// OK
BOOT* boot();
// OK
typename IdentityBoot::type* another_boot();
Run Code Online (Sandbox Code Playgroud)
正式地说,它是一个详细的类型说明符,由[dcl.type.elab] 管理,
Run Code Online (Sandbox Code Playgroud)elaborated-type-specifier: class-key [...] [...]
根据[class]/1,用于创建一个类名,该类名被引入到使用详细类型说明符的范围中[强调我的]:
类是一种类型。它的名称成为其范围内的类名([class.name]) 。[...]
类说明符和详细类型说明符用于制作类名。
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |