您的位置:首页 > 大数据 > 人工智能

杂谈之封装main或WinMain启动函数

2016-04-10 19:58 531 查看
作者:i_dovelemon

日期:2016 - 04 - 10

来源:CSDN

主题:VS,静态库,类静态函数

引言

公司的上个项目已经结束了,加入了新的项目。新项目使用的是公司正在研发中的渲染库,趁着项目交接间的空闲时间,了解了下这个新的库。一般我初接触一个库,我都会先按F11,一遍一遍的跑几次,看看它的基本流程框架。当我使用同样的方法去了解公司的代码库的时候,我发现了一个很奇怪的现象。公司库里面的启动函数WinMain居然在项目工程里面找不到,而是在静态代码库里面。这个我以前从来没有遇到过。所以很好奇,就试着去试验了下。

试验

(1)首先,我在VS2012中新建了一个Win32 Console程序的静态库工程

(2)接着,我添加两个文件,分别为testlib.h和testlib.cpp,内容如下:

#ifndef __TESTLIB__H_
#define __TESTLIB__H_

int main();

class Test
{
public:
static void printMsg();
};

#endif


#include "stdafx.h"
#include <iostream>
#include "testlib.h"

int main()
{
Test::printMsg();
system("pause");
return 0;
}


(3)然后编译,生成testlib.lib文件

(4)我在新建了另外一个Win32 Console的EXE程序,添加main.cpp文件,并且将上面生成的testlib.lib和testlib.h放在新建的工程里面

(5)main.cpp中添加如下的代码:

#include "testlib.h"
#pragma comment(lib, "testlib.lib")
#include <iostream>

void Test::printMsg()
{
std::cout<<"HelloWorld" << std::endl;
}


(6)编译运行,之后发现的确能够运行。而且输出了我想要输出的printMsg中的内容。

其他

细心的读者可能发现,我上面还有一个很奇怪的现象,那就是我在testlib中定义了一个类Test,并且类Test中存在一个未被实现的printMsg函数。而这个函数我在我的EXE项目中实现了它,并且最终也能够成功的调用到这个函数。而这个技巧正是我们扩展封装之后的main和WinMain的入口。我们可以通过类似的方法,向Lib中注入一个我们自己的App类,然后让lib运行我们的App,这样就能够实现完全面向对象的编程操作了。

同时,我也很好奇,为什么类的static函数可以这样的去实现,而单纯的C函数为什么不可以这样去实现?留待下次去解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: