zoukankan      html  css  js  c++  java
  • invalid conversion from 'void* (*)()' to 'void* (*)(void*)'

    void *thread1()
     if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)  
    提示:invalid conversion from 'void* (*)()' to 'void* (*)(void*)'
    =============
    改成: void *thread1(void *)
    
    void* (*)(void*):  (*)表示这里需要一个函数指针, (void*)表示参数类型需要为void*
    参考:
    http://groups.google.com/group/comp.programming.threads/browse_thread/thread/8fddb216a36daa87/b03dda5b143e8260?#b03dda5b143e8260
    http://www.uplook.cn/index-Index-show-view3094.html?treeid=624
    
    
    =================
    void main_thread ( void *ptr )
    {
      char *message1 = "Thread 1";
      char *message2 = "Thread 2";
      pthread_t thread3, thread4;
      int iret3, iret4;
    
      iret3 = pthread_create(&thread3, NULL, (void *)&print_message_function, (void *) message1);
      iret4 = pthread_create(&thread4, NULL, (void *)&print_message_function, (void *) message2);
    
    }
    
    void print_message_function( void *ptr )
    {
         char *message;
         message = (char *) ptr;
         printf("%s 
    ", message);
    }
    
    以上这段代码在用g++编译是会有如下错误:
    invalid conversion from `void*' to `void*(*)(void*)
    
    我们注意在Posix定义建立线程函数的原型:
    
    
    extern int pthread_create (pthread_t *__restrict __threadp,
                               __const pthread_attr_t *__restrict __attr,
                               void *(*__start_routine) (void *),
                               void *__restrict __arg) __THROW;
    这个call中的第三个参数是载入一个函数,这个函数有一个参数可以传入,返回一个 通用指针。
    
    我们再来看看原来函数中是怎样调用这一原型的,基本上就是类似一下的调用方式:
    (void *)&main_thread 
    这个表达式的含义:取一个指向函数main_thread的指针,然后将其转换为一个通用指针。
    
    这就是说显然上述两个事情并非同一个事情,故而正确的调用方式是
    
      iret3 = pthread_create(&thread3, NULL, print_message_function, (void *) message1);//函数处加不加取地址符&无所谓,关键是第四个参数,以及函数的调用方式要写  正确的。
    处理函数的定义如下:
    void* print_message_function( void *ptr )
    
    值得注意的是在gcc编译时不会出错,但是用g++就会有问题,究其原因就是C语言编译器允许隐含性的将一个通用指针转换为任意类型的指针,而C++不允许。
    转载自:http://blog.sina.com.cn/s/blog_698f90230100xxfn.html
  • 相关阅读:
    python的正负无穷float("inf")的用法
    python中几个常见的黑盒子之“字典dict” 与 “集合set”
    python中几个常见的“黑盒子”之 列表list
    Python 排序---sort与sorted学习
    django中使用Profile扩展User模块(基于django 1.10版本下)
    获取Linux进程运行在哪个CPU内核上面的方法
    【转】Crontab定时任务配置
    【转】sudo命令情景分析
    【转】详解Python的装饰器
    一步步来配置安卓开发环境ADTBundle
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4509580.html
Copyright © 2011-2022 走看看