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

时间:2015-03-04 16:19:13

标签: 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. 我能解决这个问题吗? (我真的需要!)

1 个答案:

答案 0 :(得分:2)

我遇到了完全相同的问题,对我而言,找不到NTSTATUS的定义。
这将导致typedef NTSTATUS( WINAPI* PNT_QUERY_SYSTEM_INFORMATION )被解释为&#34;函数返回函数&#34;的typedef,即:

typedef func( __stdcall PNT_QUERY_SYSTEM_INFORMATION )(...)

而不是:

typedef LONG( __stdcall PNT_QUERY_SYSTEM_INFORMATION )(...)

因为NTSTATUS实际上是LONG的typedef。

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