Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165631
  • 博文数量: 43
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-26 00:58
文章分类
文章存档

2014年(2)

2013年(41)

我的朋友

分类: C/C++

2013-03-11 19:46:21

下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
  >1:int *(*a[5])(int, char*);
  >2:void (*b[10]) (void (*)());
  >3. double(*(*pa)[9])();
  答案与分析:
  对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
  >1:int *(*a[5])(int, char*);
  //pFun是我们建的一个类型别名
  typedef int *(*pFun)(int, char*);
  //使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
  pFun a[5];
  >2:void (*b[10]) (void (*)());
  //首先为上面表达式蓝色部分声明一个新类型
  typedef void (*pFunParam)();
  //整体声明一个新类型
  typedef void (*pFun)(pFunParam);
  //使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
  pFun b[10];
  >3. double(*(*pa)[9])();
  //首先为上面表达式蓝色部分声明一个新类型
  typedef double(*pFun)();
  //整体声明一个新类型
  typedef pFun (*pFunParam)[9];
  //使用定义的新类型来声明对象,等价于double(*(*pa)[9])();
  pFunParam pa;
 
DLL(动态连接库),然而可以分为动态调用于静态调用。下面我分别举一个例子说说。
1)动态调用:
首先:在VC++6.0中创建 Win32 Dynamic-link library工程创建一个动态连接库工程:
            在头文件TestDll.h中写下代码
            extern "C" int __declspec(dllexport) add(int numa, int numb);
            在源文件TestDll.cpp中实现改函数:
            int __declspec(dllexport) add(int numa, int numb)
            {
                      return numa + numb;
            }
其次,创建一个测试程序,TestDemo,创建一个.cpp文件,然后放下代码:
HINSTANCE hinstance;
typedef int (*lpAdd)(int a, int b);

lpAdd lpadd;
int main()
{
          hinstance = LoadLibrary("E:\\vc\\DLL\\TestDll\\Debug\\TestDll.dll");
          lpadd = (lpAdd)GetProcAddress(hinstance, "add");
          cout << "2 + 3 = " << lpadd(2, 3) << endl;
          FreeLibrary(hinstance);
          return 0;
}
而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。
  首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;
    其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;
   再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;
     最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。
    通过这个简单的例子,我们获知DLL定义和调用的一般概念:
      (1)DLL中需以某种特定的方式声明导出函数(或变量、类);
     (2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。

2)静态连接:
代码如下:
#include
using namespace std;
 
#pragma comment(lib,"Testlib.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main()
{
         int result = add(2,3);
         cout << result << endl;
         return 0;
}
阅读(887) | 评论(0) | 转发(0) |
0

上一篇:hostent结构体

下一篇:csv到mysql数据库

给主人留下些什么吧!~~