C语言开发Win32程序太麻烦?微软不支持有3个原因

微软不支持用C来开发Win32的原因,简单来说有3点:

1、C并不是应用开发语言

2、微软有C++类库MFC

3、微软甚至也不支持普通用户C++

下面我们分条阐述。

若你仔细去进行观察,那么你就会发觉,Windows的那个系统开发接口,也就是API,它是借助C语言来予以提供的。

为什么会这样?

不仅仅是Windows,Linux以及MacOS这般,它们所施行的做法是相同的,原因在于此。

几乎所有当下操作系统的首选是C语言,一方面,C语言可以对内存分配进行极为精细的控制,进而能够确保系统速度,另一方面,C语言与汇编指令相互混搭,从而直接对硬件进行操作。

从系统接口的这个特定角度来看,C所暴露出来的接口,在进行link操作的时候,能够确保不会发生改变,其兼容性是最为良好的。

早期就发布了Windows,微软当时是要让人们运用C语言方式去写程序。

很快,人们发现了一个问题。

仅仅是一个输出"Hello World"的GUI窗口类程序,居然就需要50至80行的代码程序。

大概如下:

plaintext 复制代码
#include 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, int nCmdShow)
{
    // 1. 注册窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszClassName = L"HelloClass";
    RegisterClass(&wc);
    // 2. 创建窗口
    HWND hwnd = CreateWindow(
        L"HelloClass",           // 窗口类名
        L"Hello World",          // 窗口标题
        WS_OVERLAPPEDWINDOW,     // 窗口样式
        CW_USEDEFAULT,           // X位置
        CW_USEDEFAULT,           // Y位置
        400,                     // 宽度
        300,                     // 高度
        NULL,                    // 父窗口
        NULL,                    // 菜单
        hInstance,               // 实例句柄
        NULL);                   // 附加参数
    if (!hwnd) return -1;
    // 3. 显示窗口
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    // 4. 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

上头的那个程序里头,存在着数量众多的重复性质的代码,然而这是Windows所需要的,其中涵盖了:

1、注册窗口类

2、创建窗口

3、显示窗口

4、窗口消息处理

5、窗口退出函数(没错,这个也要写)

也就是说,Windows这个系统,对于使用者而言是很便利易于操作的,只要点点鼠标就能够使用,它是所谓"友好"的系统,然而呢,Windows编程可不是个轻松的活儿,它不是那种简单容易干的事,而是要写很多不少的代码,只有这样才可以把Windows编程给做好弄好。

对于从事编程工作的人员而言,尤其是在Windows早期的时候,众多Dos编程人员正是于这个阶段选择了告别编程,究其原因在于它的复杂程度实在是超乎想象,达到了令人难以应对的地步。而这般呈现出"断崖式"特征的离开情形,微软在事先是完全没有做好相应准备的。

那段时期,Windows尽管在用户群体那里热度极高,然而其开发却致使从事Windows开发的人员陷入极度的困扰之中,令他们的工作变得异常艰难!

那怎么办呢?

微软所走的道路,是将代码予以简化,借助当时最为流行的C++ ,达成这一点。

所以微软便推出了MFC,给出了一堆的类库以及VC这个开发厉害工具,所以一个hello World,成为了这般模样:

plaintext 复制代码
#include 
class CMyFrame : public CFrameWnd
{
public:
    CMyFrame()
    {
        Create(NULL, _T("Hello MFC"), WS_OVERLAPPEDWINDOW, 
               CRect(100, 100, 500, 400));
    }
};
class CMyApp : public CWinApp
{
public:
    BOOL InitInstance()
    {
        m_pMainWnd = new CMyFrame();
        m_pMainWnd->ShowWindow(m_nCmdShow);
        return TRUE;
    }
};
CMyApp theApp;

一下子清爽了好多,并且由于有App和Framework这两个类被添入,代码变得十分清新了,另外VC IDE增添了App Wizzard和Class Wizzard,还有Resource、Dialog这些具备可视化特性的"资源"工具,把Windows编程的门槛快速降低了,此次稳住了Windows开发的整体局面。

尽管是这样,然而C++并非是那种称得上"容易"的语言,对于专业从事开发工作的人员来讲依旧十分艰难。

哪怕到现在,C++程序员也不是很多。

微软怀揣着改变现状的想法,借助收购这一方式,买下了一家能提供"所见即所得"技术的公司,随后开发出了后来的Visual Basic。

这种开发方式,就是提供一个界面:

在这个界面当中,能够看到的情况是,一侧呈现的是一些在Windows时常会用到的控件,像按钮(Button)这般,列表(ListBox)也属于此类,还有下拉框(ComboBox)它们也在其中。用户能够凭借鼠标直接拖动到处于中间位置的空白Windows之上,进而便能够形成界面。要是想要对按钮(Button)的标题予以修改,仅仅借助"属性"窗口便达成目的!

按钮被用户双击之后,能够编写"Button_Clik"函数,以此来撰写对应的功能。

这般的界面,着实是极为契合"直觉"标准,刹那间便致使使用难度降低了九成,使得一名普通用户也能够迅速学会Windows开发了。

于是,微软就作出了分级。

普通用户,用Visual Basic来编程。

高级功能,比如说编写用户控件,就使用原本的Visual C++,交由高级用户去实现,与此同时,存在一些系统级别的功能,以ActiveX、COM组件的形式予以提供,这同样能够让高级用户来达成。

仰仗这种"高加上低"的搭配方式,Windows的开发形态如此这般就被确定下来了。

没错,在Java被研发出来以后呢,彼时微软便着手打造出了C#,进而取代了VB原本所占据的位置。

此刻,Windows平台那儿的开发,有着一种好似"日薄西山"这般情形的意味,更多的情形是运用Web技术经由Electronic这种具备跨平台特性的技术去开展编写。

想想过去那些Windows开发的岁月,让我想起了一首词。

它源自明代富有才学之士杨慎所创作的《临江仙·滚滚长江东逝水》,其具体内容是这样的:

plaintext 复制代码
滚滚长江东逝水,
浪花淘尽英雄。
是非成败转头空。
青山依旧在,
几度夕阳红。
白发渔樵江渚上,
惯看秋月春风。
一壶浊酒喜相逢。
古今多少事,
都付笑谈中。

IT的江水滚滚向前,那里面有多少人的青春岁月啊!

我是明月,

一个互联网IT人!

相关推荐
cmpxr_1 天前
【C】数组名、函数名的特殊
c语言·算法
itman3011 天前
C语言怎么学?从写程序到玩指针的实操攻略
c语言·指针·结构体·编程学习·资源推荐
kang_jin1 天前
C语言结构体入门:stu定义与成员使用
c语言·教程·编程语言·入门·结构体
独小乐1 天前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
li1670902701 天前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
笨笨饿1 天前
# 52_浅谈为什么工程基本进入复数域?
linux·服务器·c语言·数据结构·人工智能·算法·学习方法
Shadow(⊙o⊙)1 天前
static与extern使用
c语言·学习
范纹杉想快点毕业1 天前
Zynq开发视角下的C语言能力分级详解
c语言·开发语言
小白狮ww1 天前
3 秒出全纹理!TRELLIS.2 实现单图生成高分辨率 3D 资产
图像处理·人工智能·3d·语言模型·微软·开源·3d内容生成
橘子编程1 天前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式