在 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;
}