(在使用g ++编译器的Win32API上下文中询问此问题).我很难理解为什么以下代码行不起作用
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
Run Code Online (Sandbox Code Playgroud)
wndclass是WNDCLASSEX结构的一个实例,Windows API明确指出其成员hbrBackground的类型是HBRUSH.此外,HBRUSH只是HANDLE的typedef,而HANDLE又是void*的typedef.因此,HBRUSH应为void*类型.现在,GetStockObject函数的返回类型是HGDIOBJ,它也被命名为HANDLE,因此是void*.
Windows数据类型 http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
GetStockObject http://msdn.microsoft.com/en-us/library/dd144925(v=vs.85).aspx
WNDCLASSEX http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577(v=vs.85).aspx
为什么编译时会出现以下错误:
invalid conversion from 'HGDIOBJ {aka void*}' to 'HBRUSH' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
如果我从GetStockObject显式地转换返回的值,它可以工作
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
Run Code Online (Sandbox Code Playgroud)
感谢您的任何帮助.
我一直在使用类似的代码在嵌入式C中多次跟随.
#include <stdio.h>
int g_uArray[5] =
{ 1, 1, 2, 3, 5};
void* foo( int uIndex );
int main()
{
int* uVar;
uVar = foo( 2 );
printf( "Value = %u\n", *uVar );
return 0;
}
void* foo( int uIndex )
{
return (void*) &g_uArray[uIndex];
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在使用gcc编译时非常有效,但在使用g ++编译时会抛出错误
invalid conversion from ‘void*’ to ‘int*’
Run Code Online (Sandbox Code Playgroud)
换行
uVar = foo( 2 );
Run Code Online (Sandbox Code Playgroud)
但是它可以通过给出-fpermissive标志来编译.现在,我的问题是为什么C++给出错误是非常重要的(gcc -Wall甚至没有给出警告).如果我使用-fpermissive进行编译会产生一些运行时问题吗?
例如,下面的行可以用 gcc 编译,
float *m = calloc(rows*cols, sizeof(float));
Run Code Online (Sandbox Code Playgroud)
但是 g++ 抱怨指针类型不匹配,如下所示。
../../../../../YOLO/darknet/src/gemm.c:33:22:错误:从“void*”到“float*”的无效转换
(也许 callc 在 C++ 中总是返回 void* ?)
我可以让 g++ 忽略这个指针类型不匹配错误吗?(我找到了这个链接,但他们说这是不可避免的。如果我们可以在 C++ 代码中使用 C 代码而无需在任何地方修复它,那就太好了。)