免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3535 | 回复: 10
打印 上一主题 下一主题

请问:这里typedef是什么用法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-06 17:43 |只看该作者 |倒序浏览
typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?

能否去掉typedef ,改写一下?谢谢!
--------------------------------------------

补充一下,只见到这种用法
--------------------------------------------------------
ypedef 定义函数指针
jiahui1105 发表于 2006-8-26 12:33:00

关于C++中函数指针的使用(包含对typedef用法的讨论)
(一)简单的函数指针的应用。
//形式1:返回类型(*函数名)(参数表)
char (*pFun)(int);
char glFun(int a){ return;}
void main()
{
    pFun = glFun;
    (*pFun)(2);
}
        第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。
        第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
        然后就是可爱的main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。
(二)使用typedef更直观更方便。
//形式2:typedef 返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);
PTRFUN pFun;
char glFun(int a){ return;}
void main()
{
    pFun = glFun;
    (*pFun)(2);
}
        typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
        第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。

三)在C++类中使用函数指针。
//形式3:typedef 返回类型(类名::*新类型)(参数表)
class CA
{
public:
    char lcFun(int a){ return; }
};
CA ca;
typedef char (CA::*PTRFUN)(int);
PTRFUN pFun;
void main()
{
    pFun = CA::lcFun;
    ca.(*pFun)(2);
}
        在这里,指针的定义与使用都加上了“类限制”或“对象”,用来指明指针指向的函数是那个类的这里的类对象也可以是使用new得到的。比如:
CA *pca = new CA;
pca->(*pFun)(2);
delete pca;
        而且这个类对象指针可以是类内部成员变量,你甚至可以使用this指针。比如:
        类CA有成员变量PTRFUN m_pfun;
void CA::lcFun2()
{
   (this->*m_pFun)(2);
}
        一句话,使用类成员函数指针必须有“->*”或“.*”的调用。

[ 本帖最后由 jglxgz 于 2006-11-6 17:45 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-11-06 18:58 |只看该作者

回复 1楼 jglxgz 的帖子

高手吃饭回来没?
呵呵!

论坛徽章:
0
3 [报告]
发表于 2006-11-06 19:18 |只看该作者
typedef 就是 typedef,no alternative but it

论坛徽章:
0
4 [报告]
发表于 2006-11-06 19:23 |只看该作者
原帖由 langue 于 2006-11-6 19:18 发表
typedef 就是 typedef,no alternative but it


typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?

能否去掉typedef ,改写一下?谢谢!
例如 语句create_t* func; 重新改写,就用其本来的定义,也就是不通过typedef 来代替,例如如下语句:
typedef  unsigned int UINT;
UNIT a;可以改写为:unsigned int a;

我想弄清楚:
typedef polygon* create_t();
typedef void destroy_t(polygon*);

create_t*,destroy_t*代表什么?
谢谢!

论坛徽章:
0
5 [报告]
发表于 2006-11-06 19:28 |只看该作者
typedef polygon* create_t();  
typedef void destroy_t(polygon*);   

typedef的功能是引入一个类型定义,上面的语句就是定义了create_t和destroy_t这两个函数类型.

create_t*,destroy_t*代表什么?

是指向一个函数的指针类型

能否去掉typedef ,改写一下?谢谢!

去掉typedef后就成了变量定义或函数声明.

论坛徽章:
0
6 [报告]
发表于 2006-11-06 19:45 |只看该作者
当然能去掉,不过去掉意义就 完全不一样了。^_^

论坛徽章:
0
7 [报告]
发表于 2006-11-06 19:51 |只看该作者
原帖由 coldwarm 于 2006-11-6 19:28 发表
typedef polygon* create_t();  
typedef void destroy_t(polygon*);   

typedef的功能是引入一个类型定义,上面的语句就是定义了create_t和destroy_t这两个函数类型.

create_t*,destroy_t*代表什么?

...

create_t*,destroy_t*实际上是引出的定义,这个是在so导出class时遇到的,具体代码在这:


  1. # This file is part of the C++ dlopen mini HOWTO. You can find the complete
  2. # HOWTO and/or updated versions at
  3. # http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/
  4. #
  5. # Copyright 2002-2006 Aaron Isotton <aaron@isotton.com>
  6. # Licensed under the GNU GPL.

  7. example2: main.cpp polygon.hpp triangle.so
  8.         $(CXX) $(CXXFLAGS) -o example2 main.cpp -ldl

  9. triangle.so: triangle.cpp polygon.hpp
  10.         $(CXX) $(CXXFLAGS) -shared -o triangle.so triangle.cpp

  11. clean:
  12.         rm -f example2 triangle.so

  13. .PHONY: clean
复制代码


  1. #include "polygon.hpp"
  2. #include <iostream>
  3. #include <dlfcn.h>

  4. int main() {
  5.     using std::cout;
  6.     using std::cerr;

  7.     // load the triangle library
  8.     void* triangle = dlopen("./triangle.so", RTLD_LAZY);
  9.     if (!triangle) {
  10.         cerr << "Cannot load library: " << dlerror() << '\n';
  11.         return 1;
  12.     }

  13.     // reset errors
  14.     dlerror();
  15.    
  16.     // load the symbols
  17.     create_t* create_triangle = (create_t*) dlsym(triangle, "create");
  18.    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19.     const char* dlsym_error = dlerror();
  20.     if (dlsym_error) {
  21.         cerr << "Cannot load symbol create: " << dlsym_error << '\n';
  22.         return 1;
  23.     }
  24.    
  25.     destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy");
  26. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  27.     dlsym_error = dlerror();
  28.     if (dlsym_error) {
  29.         cerr << "Cannot load symbol destroy: " << dlsym_error << '\n';
  30.         return 1;
  31.     }

  32.     // create an instance of the class
  33.     polygon* poly = create_triangle();
  34. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  35.     // use the class
  36.     poly->set_side_length(7);
  37.         cout << "The area is: " << poly->area() << '\n';

  38.     // destroy the class
  39.     destroy_triangle(poly);

  40.     // unload the triangle library
  41.     dlclose(triangle);
  42. }
复制代码


  1. #ifndef POLYGON_HPP
  2. #define POLYGON_HPP

  3. class polygon {
  4. protected:
  5.     double side_length_;

  6. public:
  7.     polygon()
  8.         : side_length_(0) {}

  9.     virtual ~polygon() {}

  10.     void set_side_length(double side_length) {
  11.         side_length_ = side_length;
  12.     }

  13.     virtual double area() const = 0;
  14. };

  15. // the types of the class factories
  16. typedef polygon* create_t();
  17. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18. typedef void destroy_t(polygon*);
  19. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  20. #endif
复制代码


  1. #include "polygon.hpp"
  2. #include <cmath>

  3. class triangle : public polygon {
  4. public:
  5.     virtual double area() const {
  6.         return side_length_ * side_length_ * sqrt(3) / 2;
  7.     }
  8. };

  9. // the class factories
  10. extern "C" polygon* create() {
  11.     return new triangle;
  12. }

  13. extern "C" void destroy(polygon* p) {
  14.     delete p;
  15. }
复制代码


麻烦仔细解释一下,谢谢!


Sample TextSample Text

论坛徽章:
0
8 [报告]
发表于 2006-11-06 19:54 |只看该作者
原帖由 高峰 于 2006-11-6 19:45 发表
当然能去掉,不过去掉意义就 完全不一样了。^_^


能否去掉typedef ,改写一下?谢谢!
~~~~~~~~~~~~~~~~~~~~~~~
不是去掉,是改写!

例如 语句create_t* func; 重新改写,就用其本来的定义,也就是不通过typedef 来代替,例如如下语句:
typedef  unsigned int UINT;
UNIT a;可以改写为:unsigned int a;

论坛徽章:
0
9 [报告]
发表于 2006-11-06 19:56 |只看该作者

回复 1楼 jglxgz 的帖子

请高手仔细解释!
        ~~~
谢谢!!!!

论坛徽章:
0
10 [报告]
发表于 2006-11-06 20:16 |只看该作者

  1. polygon* (*createFuncPtr)();这样就定义了一个函数指针类型的变量.
复制代码


看了一下你的代码的头文件应当改成


  1. #ifndef POLYGON_HPP
  2. #define POLYGON_HPP

  3. class polygon
  4. {
  5. protected:
  6.         double side_length_;

  7. public:
  8.         polygon()
  9.                 : side_length_(0)
  10.         {
  11.         }

  12.         virtual ~polygon()
  13.         {}

  14.         void set_side_length(double side_length)
  15.         {
  16.                 side_length_ = side_length;
  17.         }

  18.         virtual double area() const = 0;
  19. };

  20. #ifdef __cplusplus        // 通过编译预处理宏来使头文件用户无论在使用C还是C++编译器时
  21. ,共享库导出函数名

  22.                                      //字都是用的是C语言的函数名字修饰方式
  23. extern "C"
  24. {
  25. #endif // __cplusplus

  26.         typedef polygon* create_t();
  27.         typedef void destroy_t(polygon*);
  28. #ifdef __cplusplus
  29. }
  30. #endif // __cplusplus

  31. #endif //POLYGON_HPP
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP