这是 C++ 中的函数类型定义吗?
Is this typedef-ing a function in C++?
这是一个示例C++代码块。我阅读了typedef,struct,enum和union的定义,但我仍然无法破译这一点。
typedef NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
- NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE( 是一个函数吗?为什么参数之间有一个 *?
- 在 HANDLE FileHandle 中,OUT PIO_STATUS_BLOCK IoStatusBlock..输入/输出是什么意思?
- 为什么没有新的别名?
是否可以声明新的别名和指针别名?在下面的示例中,我会使用 PFILE_NAME_INFORMATION 作为指针名称,否则FILE_NAME_INFORMATION?
typedef struct _FILE_NAME_INFORMATION { ... } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
这个 typedef 声明
typedef NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
为类型引入了alias named
PFN_NTQUERYINFORMATIONFILE'
NTSTATUS (WINAPI * )(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
表示指向具有 5 个参数且返回类型 NTSTATUS
的函数的指针。
现在,您可以使用此名称来声明指向此类函数的指针
PFN_NTQUERYINFORMATIONFILE ptr;
您可以通过以下方式获得相同的看起来更清晰的结果
using PFN_NTQUERYINFORMATIONFILE =
NTSTATUS (WINAPI * )(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
);
还要考虑以下简单示例
#include <iostream>
int sum( int x, int y )
{
return x + y;
}
int product( int x, int y )
{
return x * y;
}
int division( int x, int y )
{
return x / y;
}
typedef int ( *fp )( int, int );
int main( )
{
for ( fp f : { sum, product, division } ) std::cout << f( 10, 2 ) << std::endl;
}
输出为
12
20
5
请注意,函数名称在表达式中使用时会隐式转换为指向函数的指针。
因此,例如,带有上述演示程序函数的语句是有效的
std::cout << ( ***/* replace the comment with as many asterisks as you like */****sum )( 10, 20 ) << std::endl;
因此,如果您根据程序中键入的符号数量获得报酬,那么您可以将此技巧与函数调用一起使用。
(****************************************************sum )( 10, 20 );
这仅受编译器限制的限制。
至于IN
和OUT
,那么它们是Microsoft使用的宏,用于明确函数的每个参数的用途,是提供输入值还是用作输出参数。
这是函数指针的类型别名。
NTSTATUS (WINAPI * PFN_NTQUERYINFORMATIONFILE( 是一个函数吗?为什么参数之间有一个 *?
不,这只是类型的一部分。 *
表示指针。这是一个指向具有WINAPI
(__stdcall
(调用约定、NTSTATUS
返回值和几个参数(HANDLE
、PIO_STATUS_BLOCK
、PVOID
、ULONG
和FILE_INFORMATION_CLASS
(的函数的指针。
在 HANDLE FileHandle 中,OUT PIO_STATUS_BLOCK IoStatusBlock..输入/输出是什么意思?
这些是注释。IN 表示函数仅将参数用于输入,OUT 表示函数仅将参数用于输出(它写入参数指向的内容(。INOUT 意味着函数读取和写入所指向的内容。
Neil MacIntosh实际上在今年的CppCon上做了几个关于静态分析的演讲,他谈到了这些注释是如何出现在Microsoft代码库中的,以及它们如何帮助提高静态分析工具的功能,而不需要更多资源。但是,您可以为实际类型提供相同的帮助,而不是编译为无的注释,这就是带有GSL的CppCoreGuidelines项目正在采用的方法。
为什么没有新的别名?
有。这是PFN_NTQUERYINFORMATIONFILE
.这只是 C 声明语法的一个怪癖,在大多数情况下,它从内到外而不是从左到右阅读。
不是是否可以声明新的别名和指针别名?
我知道的,不是。如果你对typedef NTSTATUS(WINAPI func)(...), *func_pointer;
做了同样的把戏,func_pointer
将是一个NTSTATUS*
,而func
与问题中的相同,但不是指针。
这当然适用于通过typedef
产生的其他类型的别名,例如问题中的struct
示例,它确实将FILE_NAME_INFORMATION
声明为struct _FILE_NAME_INFORMATION
,PFILE_NAME_INFORMATION
声明为struct _FILE_NAME_INFORMATION*
,struct
在那里强调所声明的不同类型的名称。
-
不,它是一个函数指针。中间的星号只是函数指针正常语法的一部分 -
WINAPI
只是一个宏。 -
宏也是。
IN
表示函数读取的参数(如常量引用或按值复制的参数(,而OUT
引用用于"返回"参数的参数(如非常量引用(。 -
有一个:
PFN_NTQUERYINFORMATIONFILE
. -
是的。
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型