Prefer C++(一)

本文认为《Eric Raymond对于几大开发语言的评价》对C++评价偏颇,阐述了C++相比C语言的优势。C++有更严格的类型系统,能防范失误引起的错误;可利用构造和析构函数建立资源管理机制,防止资源泄露;还支持强大的inline,能提高性能。

Prefer C++

Written by 李智勇

前言

读了《Eric Raymond对于几大开发语言的评价》一文,觉得其对C++的评价极其偏颇。C++本身支持多典范设计,也就是说你可以完全不用OO,GP而只采用结构化的方法去进行程序设计。这个时候同C相比,效率是基本一致的。而确可以享受到更严格的类型系统检查、inline函数、名字空间、运算符重栽所带来的益处。如果你牺牲一点效率,你还可以使用异常处理。

我以前为项目组成员写过一篇文章,号召大家从C转向C++。现贴出此文,望方家斧正。

 

1、比C更严格的类型系统

        char szBuf[MAX_PATH];

        WORD j=szBuf;

        C里面是允许的是个警告,而在C++里面则非法是错误。

        WORD Add(WORD a,WORD b);

           Add(1,szBuf);可能导致灾难性的后果。

更关键的是处理回调函数时:

        比如API函数原型int SetAbortProc(HDC hdc,  ABORTPROC lpAbortProc);
    

                     调用时有SetAbortProc(hdcPrn, AbortProc)

如果AbortProcABORTPROC类型不符,在c里边将自动转换类型。绝对可能导致灾难性的后果。此时堆栈会如何?

总之C++在防范失误所引起的错误方面做的更好,但绝对不禁止故意打破类型系统的行为。由于必须兼容C,C++做的也不好,警告后还是要做类型转换的。看下面这个例子:

    int a=0;

    unsigned b=0;

    int i;

    for(i=10; i>=b; --i)

        {

         a++;

        }

 

 

 

其实这是个死循环。问题出在i和b类型不匹配(编译时这是个警告,而不是错误)。当必须进行比较时,都会被转成unsigned,于是i>=b将永远为true。

 

2、智能化的资源管理

利用C++的构造和析构函数可以建立非常完善的资源管理机制,尽可能的防止资源泄露。看下面的程序段:

void func1()

{

     char* szBuf=malloc(50);//利用C中void* 到其他类型指针的自动转换

 

     --------

 

     free(szBuf);

     return ;

}

   这样在分配和释放内存之间的任何一个地方,如果需要返回,则必须有这种形式的代码:

if(---)

{ free(szBuf); return 0;}

而一旦忘记释放内存而返回,必将产生内存泄露。

 

C++类的实例有这样一种特性。在其作用域开始的时候,构造函数被调用,超出作用域时析构函数被调用。利用这一规律来管理资源的最有名的例子是标准库中的智能指针(参看:More Effevtive C++,The C++ Standard Library及The C++ Programming Language。

下面简要说明其原理:

Class A;

void func2()

{

    A  a; //构造函数被调用

    ------

    return; //析构函数被调用

}

如果在Class A的构造函数中完成相关资源分配,在析构函数中释放内存会怎样?

分配内存后再不用担心释放的问题了。

 

A大致有如下的形式:

typedef struct tagPoint

{

    int x;

    int y;

}Point,PPoint;

 

Class A

{

    PPpoint pointer;

    SmartPointer(PPpoint p)

    {  

        pointer=p;

    }

 

    ~SmartPointer()

    {

        if(pointer)

        delete pointer;

    }

 

    Point & operator*() const

    {

        return *pointer;

    }

    Point * operator->() const

    {

        return pointer;

    }

};

这样用到Point时就可以这样:

A pointer(new Point);//为Point结构分配了内存

pointer->x=5;        //存取相关元素

//超出作用域时为Point分配的内存将被自动删除

 

而为每一个结构都写一个类不划算,所以人们发明了模板。应用模板时A被定义成这个样子:

 

template <typename T> class SmartPointer

{

    SmartPointer(T* p)

    {  

        pointer=p;

    }

 

    ~SmartPointer()

    {

        if(pointer)

        delete pointer;

    }

 

    T& operator*() const

    {

        return *pointer;

    }

    T* operator->() const

    {

        return pointer;

    }

 

private:

    T* pointer;

};

这样不管什么结构,都可以用A了。

使用时是这样:

A<Point> pointer(new Point);

pointer->x=5;

//超出作用域时为Point分配的内存将被自动删除

 

 

N多人阐述过这个观点,但我觉得在windows下最有用的是附件1。

可实现对Windows下各种句柄的智能化管理。

作者:Jeffey Richter 2000年第四期msdn杂志,win32 Q&A专栏

 

读懂这个例子需要一点模板和符号重载的知识。

用起来很简单:

比如对于文件句柄,有:

CensureCloseHandle hHandle=CreateFile(---);

WriteFilehHandle;

----------

不用调用CloseHandle了,超出作用域它将被自动调用。

 

最嚣张的应用是有引用记数的智能指针。

见附件2。(Come from the C++ standard library)

3、强大的inline(C不支持这个吧!)

第一次看Link-time Code GenerationMatt Pietrek MSDN magazine 2002 5别的也没记住,就记了个通过链接器自主选择那些函数可以做inline可大幅度提高性能。后来自己就在vc++上试了一下,结果还是真恐怖,先说性能最多能提高多少,看下面的程序,并猜猜inline函数所花费的时间:

int add(int a,int b)

{

       return a+b;

}

 

inline int addinline(int a,int b)

{

       return a+b;

}

 

都是以这种形式进行调用:

    int b;

    for(int j=0;j<50000;j++)

    {

        b=add(60,70);

    }

假设add()所花费的时间是:88964ns(vc++ 6.0 release 版本下),那么addinline所花费的时间是多少?

 

 

真实结果是0,也就是说addinline函数根本不存在。被优化后,剩下的只是一个值0x82。当然这是一个极端的例子,但从另一个角度讲把适当的函数做成inline实际上是给编译器,连接器做出更大优化的机会。

 

inline的另一个优势。

大家都知道,函数调用要处理堆栈(很少是寄存器)。这样就有一部分进栈和出栈的指令,这部分代码对于inline是没有的。

for(int j=0;j<50000;j++)

       {

              b=add(j,j+1);

       }

for(int p=0;p<50000;p++)

       {

              b=addinline(p,p+1);

       }

cout<<b;//必须使用一下b

此时所耗费的时间两者分别为:

1.10619e+006ns 和331754ns

 

 

<think>嗯,用户的问题是关于在安装某些Python包时遇到的Microsoft Visual C++ 14.0或更高版本缺失的问题,需要C++相关的处理方法或解决方案。我需要根据提供的引用内容来整理解决方案。首先,我应该先看看这些引用都提到了哪些共同点。 根据引用[1]、[2]、[3]、[4],所有的问题都是因为安装Python包时需要C++构建工具。解决方案都指向安装Microsoft C++ Build Tools。所以,核心的解决方法应该是安装这个构建工具。用户可能已经尝试过安装Python包,但遇到了错误提示,现在需要具体的步骤来解决这个问题。 接下来,我需要确定如何步步指导用户安装Microsoft C++ Build Tools。根据引用[1],正确的下载链接是https://visualstudio.microsoft.com/visual-cpp-build-tools/。用户需要访问这个链接,下载并安装。安装过程中需要注意勾选哪些组件呢?通常来说,可能需要包含Windows SDK和最新的MSVC工具集,比如MSVC v143。另外,用户可能需要重启电脑才能生效,这也是需要注意的地方。 然后,用户可能已经安装了Visual Studio,这时候是否需要单独安装构建工具?或者是否可以通过修改现有安装来添加C++组件?引用中提到,如果已经安装了Visual Studio,可以通过安装程序添加“使用C++的桌面开发”工作负载,这可能是个替代方案。 另外,用户可能在使用旧版本的Python包,是否有必要升级pip和setuptools?或者是否可以通过安装预编译的二进制包来避免编译问题?比如使用wheel文件,或者通过conda来安装,因为conda可能提供已经编译好的版本,不需要本地编译依赖C++工具链。 此外,用户的环境变量是否正确配置?安装完构建工具后,可能需要确保cl.exe在系统路径中,或者在命令提示符中使用正确的环境。例如,使用“x64 Native Tools Command Prompt”来执行安装命令,这可能会解决路径问题。 还需要考虑用户的操作系统版本是否满足要求,比如是否支持Visual Studio 2022的构建工具。如果用户的操作系统过旧,可能需要更新系统。 最后,如果上述步骤都无效,用户可能需要寻求进步的帮助,比如检查错误日志,或者在开发者社区提问。这时候,提供相关的资源链接会很有帮助,比如Microsoft的官方文档或Stack Overflow的讨论。 总结下,解决方案应该分为几个步骤:安装构建工具,检查Visual Studio的配置,使用替代安装方法,验证环境变量,处理系统兼容性,以及寻求社区支持。每个步骤需要详细说明,确保用户能够按照指导操作。同时,生成的相关问题需要围绕这些步骤展开,帮助用户深入理解可能遇到的问题。</think>### C++ 相关问题的解决方案 #### 问题背景 在安装某些Python包(如`pyflux`、`ecos`、`gensim`)时,可能遇到以下错误提示: ``` error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools" ``` 这是因为这些包依赖C/C++编译环境,需安装 **Microsoft Visual C++ Build Tools** 或 **Visual Studio 的C++组件**[^1][^2][^3][^4]。 --- #### 解决步骤 1. **安装 Microsoft C++ Build Tools** - 访问官方下载页面:[Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) - 下载并运行安装程序,勾选以下组件: - `Windows SDK`(对应系统版本) - `MSVC v143 - VS 2022 C++ x64/x86 build tools`(最新版本) - 完成安装后重启系统[^1][^4]。 2. **通过 Visual Studio 添加C++组件(若已安装)** - 打开Visual Studio安装程序,选择“修改”。 - 勾选工作负载:`使用C++的桌面开发`。 - 包含子项:`Windows 10/11 SDK` 和 `MSVC v143 build tools`[^1]。 3. **使用预编译二进制包(替代方案)** - 使用`pip`安装时添加参数: ```bash pip install --prefer-binary 包名 ``` - 或通过`conda`安装(避免编译依赖): ```bash conda install 包名 ``` 4. **验证环境变量** - 确保`cl.exe`(C++编译器)路径已添加到系统变量`PATH`中,默认路径为: ``` C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\<版本>\bin\Hostx64\x64 ``` 5. **处理系统兼容性问题** - 如果仍报错,尝试以下操作: - 以管理员身份运行命令提示符。 - 使用 **x64 Native Tools Command Prompt**(Visual Studio自带)执行安装命令。 --- #### 相关引用 - 安装工具时需联网,且可能需要10GB以上磁盘空间[^1]。 - 若使用`conda`,可避免部分编译依赖问题。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值