c++ - typedef FOO(BAR) 中不允许函数返回函数

标签 c++ visual-studio-2012 typedef

我对 piece of code from SuperUser 有疑问.我什至不确定该语法的含义:

typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) ( 
  __in       SYSTEM_INFORMATION_CLASS SystemInformationClass,     
  __inout    PVOID SystemInformation, 
  __in       ULONG SystemInformationLength, 
  __out_opt  PULONG ReturnLength    
);

通常,它是 typedef oldtype newtype。在上面的语法中,我看不到 newtype。 IDE 将 PNT_QUERY_SYSTEM_INFORMATION 标记为红色并显示以下消息:错误:不允许函数返回函数。

当我将鼠标悬停在 PNT_QUERY_SYSTEM_INFORMATION 上时,我得到了这个(我不得不在这里重写整个工具提示文本...):

typedef <error-type> (__stdcall *PNT_QUERY_SYSTEM_INFORMATION)(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)

如果我尝试编译,这是关于这一行的错误(这会导致其他地方出现很多其他错误):

1>...\nostealfocus\nostealfocus\nostealfocus.cpp(6): error C2059: syntax error : '__stdcall'

所以...

  1. 这个语法是什么意思?像这样更通用的语法会做什么?
  2. 我可以解决这个问题吗? (我真的需要!)

最佳答案

我遇到了完全相同的问题,对我来说,这是找不到 NTSTATUS 的定义。
这将导致 typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION ) 被解释为“函数返回函数”的 typedef,即:

typedef func( __stdcall PNT_QUERY_SYSTEM_INFORMATION )(...)

而不是:

typedef LONG( __stdcall PNT_QUERY_SYSTEM_INFORMATION )(...)

因为 NTSTATUS 实际上是 LONG 的类型定义。

我的解决方法是将函数返回类型从 NTSTATUS 替换为 LONG(但理想情况下应该修复包含,以便解析 NTSTATUS) .

关于c++ - typedef FOO(BAR) 中不允许函数返回函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859456/

相关文章:

c# - 无法添加对 'Microsoft Windows Installer Object Library' 的引用

c - typedef 内部如何工作(在编译器级别)?

c++ - 使用数组防止 C++ 中的堆栈溢出?

C++ 头函数

c++ - 替换遗留的 DirectDraw 代码

windows - 是否可以找到 DLL 中声明的结构的大小?

c# asp.net debug.writeline 写在哪里?

c++ - 高效稳定的有序数之和

c++ - 对 self 的 typedef 有什么影响吗?

c++ - 最佳实践 : Should I create a typedef for byte in C or C++?