当前位置: 首页 > 知识库问答 >
问题:

在 MinGW 7.3.0 32 位中从“int”到“void (*)(void*)”的转换无效

习哲彦
2023-03-14

我必须将普通的C .h文件集成到我的C项目(Qt GUI)中。为此,我必须避免一些带有棘手替换的函数指针。您可以在下面看到的代码段之前在MinGW 5.3.0 C中编译没有任何问题。但是当我尝试使用更多新的编译器(C为7.3.0)时,我收到一个错误“从'int'到'void(void)(void)'的无效转换”,但它仍然编译没有问题与相同的7.3.0 for C。

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!**
}
//...
};

问:编译器给我的宏表达式错误是 “ ”。如何解决?

我认为这是一个铸造的问题,但我无法独自解决它。当然,我总是可以返回到以前的编译器版本或使用另一个编译器(例如,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;
}

共有2个答案

方风华
2023-03-14

溶液

事实上,我已经做到了!您的评论迫使我更加努力地思考,我发现了如何制作这个“嘲笑”技巧。我现在在没有任何警告的情况下编译了这段代码。它有什么用途?我需要的是从构造类型[]中提取某些字段的值。我相信该任务还有其他解决方案,但这个非常适合我。

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;
}
蒋茂材
2023-03-14

由于这是C语言(在C语言中是不同的),你的问题归结为

int* x = 0;

相对

int* x = 0+0;

后者不编译。Gccs错误消息或多或少与您的错误消息相同,而clogs更有帮助:

<source>:35:11: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int'
    int* x = 0+0;
          ^   ~~~

你做不到。我不能建议你怎么做,因为添加两个函数指针(在< code>MY_PART未定义的情况下)的目的不太清楚。

 类似资料:
  • 我正在编写一个小的简单程序,它使用pthreads实现了一个循环执行时间表。我首先编写了没有pthreads的程序,现在试图将参数正确地传递到pthread_create中。我知道args是: int pthread_create(pthread_t*thread,const pthread_attr_t*attr,void*(*start_routome)(void*),void*arg);

  • 描述 (Description) C库函数void (*signal(int sig, void (*func)(int)))(int)设置处理信号的函数,即信号编号为sig的信号处理程序。 声明 (Declaration) 以下是signal()函数的声明。 void (*signal(int sig, void (*func)(int)))(int) 参数 (Parameters) sig

  • 描述 (Description) C库函数int atexit(void (*func)(void))导致在程序终止时调用指定的函数func 。 您可以在任何地方注册终止功能,但会在程序终止时调用它。 声明 (Declaration) 以下是atexit()函数的声明。 int atexit(void (*func)(void)) 参数 (Parameters) func - 这是在程序终止时调

  • 字符串: 给我错误: Description资源路径位置类型从'void(attribute((stdcall))(GLenum,GLenum,GLuint,GLenum,GLsizei,const GLchar,GLvoid*){aka void(attribute((stdcall)))(unsigned int,unsigned int,unsigned int,unsigned int,u

  • 问题内容: 一般来说,对于Java和编程,我是一个新手。我正在尝试创建一个简单的程序,您可以在其中猜测我的年龄,如果您是对的,它将说“正确”,如果您错了,它将说“错”。 这是我的代码: 我收到错误消息“不兼容的类型:void无法转换为int”,但代码中没有void类?我知道我的代码可能很糟糕,但是如果你们能为我指出正确的方向,那就太好了。谢谢。 问题答案: 您的程序不必返回in 。相反,您可以将其

  • 描述 (Description) C库函数void *memset(void *str, int c, size_t n)通过参数str将字符c (unsigned char)复制到指向的字符串的前n字符。 声明 (Declaration) 以下是memset()函数的声明。 void *memset(void *str, int c, size_t n) 参数 (Parameters) str