在 MinGW 7.3.0 32 位中从 'int' 到 'void (*)(void*)' 的无效转换
Invalid conversion from 'int' to 'void (*)(void*)' in MinGW 7.3.0 32bit
我必须将纯 C .h 文件集成到我的 C++ 项目 (Qt GUI) 中。为此,我必须避免一些带有棘手替换的函数指针。您可以在下面看到的一段代码之前在 MinGW 5.3.0 C++ 中编译没有任何问题。但是当我尝试使用更新鲜的编译器(C++ 7.3.0)时,我得到一个错误“从 'int' 到 'void ()(void)' 的无效转换”,但它仍然可以毫无问题地编译 C 的 7.3.0 .
void func_to_avoid( void* );
void func_to_avoid2( void* );
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
//...
{
// SOME_MACROS( func_to_avoid ) // this expression compiles without any problem
SOME_MACROS( func_to_avoid ) + SOME_MACROS2( func_to_avoid2 ) // **compilation error!**
}
//...
};
问题:
编译器给出了带有“+”的宏表达式的错误。如何解决?
我认为这是选角的问题,但我自己解决不了。当然,我总是可以 return 到以前的编译器版本或使用其他编译器(例如,msvc),但它看起来根本不像一个解决方案。
是否有解决此编译问题的转换解决方案?
更新:下面的代码允许重现错误。正如我所说,它与 C 编译器和 5.3.0 MinGW C++ 一起工作。
main.c
void func_to_avoid( void* );
void func_to_avoid2( void* );
#define MY_PART
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
{
SOME_MACROS( func_to_avoid )+SOME_MACROS2( func_to_avoid2 )
}};
int main()
{
return 0;
}
由于这是 C++(在 C 中有所不同),您的问题归结为
int* x = 0;
对
int* x = 0+0;
后者不编译。 Gccs 错误消息与您的错误消息大致相同,而 clangs 更有帮助:
<source>:35:11: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
int* x = 0+0;
^ ~~~
你做不到。我不能推荐你做什么,因为它不太清楚添加两个函数指针的目的(在 MY_PART
未定义的情况下)应该是什么。
解决方案
其实,我做到了!你的评论迫使我更加努力地思考,我找到了如何制作这个 'mocking' 技巧。我现在编译了这段代码,没有任何警告。它的用途是什么?我需要的是从 const struct types[] 中提取某些字段的值。我敢肯定还有其他解决方案可以解决该任务,但这个非常适合我。
void func_to_avoid( void* );
void func_to_avoid2( void* );
#define MY_PART
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
char* info_example1; // for clarification
#ifdef MY_PART
//void (*func)(void*);
int func;
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
{
"info_ex1",
//I don't need this variable and now I can just skip it
SOME_MACROS( func_to_avoid )+SOME_MACROS2( func_to_avoid2 )
}};
int main()
{
return 0;
}
我必须将纯 C .h 文件集成到我的 C++ 项目 (Qt GUI) 中。为此,我必须避免一些带有棘手替换的函数指针。您可以在下面看到的一段代码之前在 MinGW 5.3.0 C++ 中编译没有任何问题。但是当我尝试使用更新鲜的编译器(C++ 7.3.0)时,我得到一个错误“从 'int' 到 'void ()(void)' 的无效转换”,但它仍然可以毫无问题地编译 C 的 7.3.0 .
void func_to_avoid( void* );
void func_to_avoid2( void* );
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
//...
{
// SOME_MACROS( func_to_avoid ) // this expression compiles without any problem
SOME_MACROS( func_to_avoid ) + SOME_MACROS2( func_to_avoid2 ) // **compilation error!**
}
//...
};
问题: 编译器给出了带有“+”的宏表达式的错误。如何解决?
我认为这是选角的问题,但我自己解决不了。当然,我总是可以 return 到以前的编译器版本或使用其他编译器(例如,msvc),但它看起来根本不像一个解决方案。 是否有解决此编译问题的转换解决方案?
更新:下面的代码允许重现错误。正如我所说,它与 C 编译器和 5.3.0 MinGW C++ 一起工作。
main.c
void func_to_avoid( void* );
void func_to_avoid2( void* );
#define MY_PART
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
#ifdef MY_PART
void (*func)(void*);
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
{
SOME_MACROS( func_to_avoid )+SOME_MACROS2( func_to_avoid2 )
}};
int main()
{
return 0;
}
由于这是 C++(在 C 中有所不同),您的问题归结为
int* x = 0;
对
int* x = 0+0;
后者不编译。 Gccs 错误消息与您的错误消息大致相同,而 clangs 更有帮助:
<source>:35:11: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
int* x = 0+0;
^ ~~~
你做不到。我不能推荐你做什么,因为它不太清楚添加两个函数指针的目的(在 MY_PART
未定义的情况下)应该是什么。
解决方案
其实,我做到了!你的评论迫使我更加努力地思考,我找到了如何制作这个 'mocking' 技巧。我现在编译了这段代码,没有任何警告。它的用途是什么?我需要的是从 const struct types[] 中提取某些字段的值。我敢肯定还有其他解决方案可以解决该任务,但这个非常适合我。
void func_to_avoid( void* );
void func_to_avoid2( void* );
#define MY_PART
#ifdef MY_PART
#define SOME_MACROS( func ) 0
#define SOME_MACROS2( func ) 0
#endif
typedef struct
{
char* info_example1; // for clarification
#ifdef MY_PART
//void (*func)(void*);
int func;
#else
AvoidedFunction_t func;
#endif
}type_descr_t;
const type_descr_t types[]
={
{
"info_ex1",
//I don't need this variable and now I can just skip it
SOME_MACROS( func_to_avoid )+SOME_MACROS2( func_to_avoid2 )
}};
int main()
{
return 0;
}