Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 赋值从整数生成指针而不进行强制转换_C_Windows_Winapi - Fatal编程技术网

C 赋值从整数生成指针而不进行强制转换

C 赋值从整数生成指针而不进行强制转换,c,windows,winapi,C,Windows,Winapi,当我尝试编译以下代码时: #define BUFSIZE MAX_PATH //.... TCHAR sz_VolumeName[BUFSIZE] ;//11 HANDLE hSearch ;//12 hSearch = FindFirstVolume(sz_VolumeName , BUFSIZE) ;//13 它给了我一个错误: [Warning] assignment makes pointer from integer without a cast -问题在第13行 这

当我尝试编译以下代码时:

#define BUFSIZE MAX_PATH 


//....


TCHAR sz_VolumeName[BUFSIZE] ;//11
HANDLE hSearch ;//12
hSearch  = FindFirstVolume(sz_VolumeName , BUFSIZE) ;//13
它给了我一个错误:

[Warning] assignment makes pointer from integer without a cast 
-问题在第13行

这里怎么了

编辑:例如:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>


#define BUFSIZE MAX_PATH


 int main(int argc, char *argv[])
  {

   TCHAR sz_VolumeName[BUFSIZE] ;
   HANDLE hSearch ;
   hSearch  = FindFirstVolume(sz_VolumeName , BUFSIZE) ; 
   printf("First Volume Name  : %s \n" , sz_VolumeName) ; 
   FindVolumeClose(hSearch) ;
   getchar() ;
   system("PAUSE"); 
   return 0;
       }
你试过了吗

hSearch  = FindFirstVolume((LPWSTR)sz_VolumeName , BUFSIZE);
你试过了吗

hSearch  = FindFirstVolume((LPWSTR)sz_VolumeName , BUFSIZE);
函数FindFirstVolume是未声明的,这使得编译器假设它返回int,而实际上它应该返回HANDLE。您得到的警告特别指您试图将int返回值隐式转换为HANDLE类型HANDLE实际上是指针类型

Windows API头中FindFirstVolume的声明很可能被某些条件编译指令隐藏。您可能必须定义_WIN32_WINNT 0x0500才能启用该函数的声明

在包含Windows API头之前,请查看是否有帮助。如果这确实是罪魁祸首,请在项目设置中将_WIN32_WINNT全局设置为0x0500。实际上,对于所有使用MS头文件的现代Windows项目,您都应该无条件地执行此操作。

函数FindFirstVolume未声明,这使得编译器假定它返回int,而实际上它应该返回HANDLE。您得到的警告特别指您试图将int返回值隐式转换为HANDLE类型HANDLE实际上是指针类型

Windows API头中FindFirstVolume的声明很可能被某些条件编译指令隐藏。您可能必须定义_WIN32_WINNT 0x0500才能启用该函数的声明


在包含Windows API头之前,请查看是否有帮助。如果这确实是罪魁祸首,请在项目设置中将_WIN32_WINNT全局设置为0x0500。实际上,对于所有使用MS头文件的现代Windows项目,都应该无条件地执行此操作。

句柄是一种非常奇怪的数据类型。它类似于指针。出现该错误的原因是FindFirstVolume函数似乎返回一个整数。这就是您的错误提到整数的原因。您将指针hsearch的类型指定给一个整数,这会告诉它指向内存中的另一个点,而不是实际将该整数值指定给它。如果希望hsearch指向FindFirstVolume中的整数,则需要执行以下操作:

*hSearch  = FindFirstVolume(sz_VolumeName , BUFSIZE) ;//13
如果要访问该整数,请执行以下操作:

int myInt = *hSearch

因为我不确定您试图在代码中实现什么,我希望这会有所帮助。

句柄是一种非常奇怪的数据类型。它类似于指针。出现该错误的原因是FindFirstVolume函数似乎返回一个整数。这就是您的错误提到整数的原因。您将指针hsearch的类型指定给一个整数,这会告诉它指向内存中的另一个点,而不是实际将该整数值指定给它。如果希望hsearch指向FindFirstVolume中的整数,则需要执行以下操作:

*hSearch  = FindFirstVolume(sz_VolumeName , BUFSIZE) ;//13
如果要访问该整数,请执行以下操作:

int myInt = *hSearch

因为我不确定您试图在代码中实现什么,我希望这会有所帮助。

您是否包括windows.h?或者WinBase.h,如果您使用的是Windows 7或Vistat,则错误提示我FindFirstVolume实际上声明为返回整数,而不是文档中的句柄。如果我查看winbase.h,它被声明为返回句柄,但它也被记录在FileApi.h中,而不是在现代操作系统版本中,并且我没有FileApi.h可查看,但可能您的应用程序使用的是FileApi.h版本,并且在该文件中声明的方式不同?@RemyLebeau,我在winbase中只有通常的声明。h@user22323然后,您可以发布一个其他人可以尝试编译的最小示例吗?@user22323:因为您使用的是TCHAR,所以应该使用_tprintf而不是printf:_tprintf_t第一个卷名:%s\n,sz\u VolumeName_tprintf在tchar.h中声明。您是否包括windows.h?或者WinBase.h,如果您使用的是Windows 7或Vistat,则错误提示我FindFirstVolume实际上声明为返回整数,而不是文档中的句柄。如果我查看winbase.h,它被声明为返回句柄,但它也被记录在FileApi.h中,而不是在现代操作系统版本中,并且我没有FileApi.h可查看,但可能您的应用程序使用的是FileApi.h版本,并且在该文件中声明的方式不同?@RemyLebeau,我在winbase中只有通常的声明。h@user22323然后,您可以发布一个其他人可以尝试编译的最小示例吗?@user22323:因为您使用的是TCHAR,所以应该使用_tprintf而不是printf:_tprintf_t第一个卷名:%s\n,sz\u VolumeName_tprintf是在tchar.h中声明的。您能帮忙解释一下什么是错误的吗?也许建议编辑一下?这就是为什么要这样做,而不仅仅是你向人们扔石头。你似乎已经在co中提交了答案
上面的mments部分出错。句柄类似于指针,但不正确。它与指针不同,它是指针。因此,取消对句柄的引用(尤其是未初始化的句柄)将整数值塞进句柄是错误的,并且会损坏内存。FindFirstVolume返回句柄,而不是整数。如果FindFirstVolume被声明为错误并且碰巧返回了一个整数,那么它仍然会表示一个句柄,因为这是API实际返回的,所以正确的做法是将整数类型转换为句柄。为什么不将其提交到答案中呢?不,将整数强制转换为句柄的类型也不正确。正确的做法是找出作用域中没有FindFirstVolume声明的原因,并加以纠正。@ElchononEdelson:是的,纠正FindFirstVolume的定义是正确的做法。但是,如果它是在范围内定义的,那么类型转换将是下一个解决方案,只要代码被编译为32位,也就是说,如果定义是错误的。您能帮忙解释一下什么是错误的吗?也许建议编辑一下?这就是为什么要这样做,而不仅仅是你向人们扔石头。您似乎错误地在上面的评论部分提交了答案。句柄类似于指针,但不正确。它与指针不同,它是指针。因此,取消对句柄的引用(尤其是未初始化的句柄)将整数值塞进句柄是错误的,并且会损坏内存。FindFirstVolume返回句柄,而不是整数。如果FindFirstVolume被声明为错误并且碰巧返回了一个整数,那么它仍然会表示一个句柄,因为这是API实际返回的,所以正确的做法是将整数类型转换为句柄。为什么不将其提交到答案中呢?不,将整数强制转换为句柄的类型也不正确。正确的做法是找出作用域中没有FindFirstVolume声明的原因,并加以纠正。@ElchononEdelson:是的,纠正FindFirstVolume的定义是正确的做法。但是,如果它被定义并在范围内,类型转换将是下一个解决方案,只要代码被编译为32位,也就是说,如果定义是错误的。如果应用程序被设置为针对Ansi而不是Unicode进行编译,即TCHAR映射到char而不是wchar,则此代码将根本无法编译。无论如何,永远不要像这样进行LPSTR/LPWSTR类型转换,这完全是错误的。如果应用程序被设置为针对Ansi而不是Unicode进行编译,即TCHAR映射到char而不是wchar,那么这段代码将无法编译。无论如何,不要这样做LpSTR/LPWSTR类型的转换,这是很明显的错误。如果它未声明,那么编译器应该失败,并用一个错误来表示同样的错误,而不是产生不同行为的不同代码。@ Remy Lebeau:不,记住这是一个C语言问题,而不是C++。在C世界中,对于未声明的函数,只有C99编译器需要失败。经典的C89/90编译器对于未声明的函数不会失败。相反,它用int返回类型来弥补缺少的声明。这正是本案发生的情况。我假设OP使用的是C89/90编译器。@Remy Lebeau:即使是C99编译器也完全可以编译调用未声明函数的代码,只要它发出诊断消息,如原始帖子中的警告。在C/C++编译器世界中,没有错误的要求。如果它未声明,编译器就应该失败,并用一个错误来表示同样的错误,而不是产生不同行为的不同代码。@ Remy Lebeau:不,记住这是一个C语言问题,而不是C++。在C世界中,对于未声明的函数,只有C99编译器需要失败。经典的C89/90编译器对于未声明的函数不会失败。相反,它用int返回类型来弥补缺少的声明。这正是本案发生的情况。我假设OP使用的是C89/90编译器。@Remy Lebeau:即使是C99编译器也完全可以编译调用未声明函数的代码,只要它发出诊断消息,如原始帖子中的警告。在C/C++编译器世界中,没有失败并出现错误这样的要求。