你已经了解C++时学习C语言?

Kea*_*eks 19 c c++

我想我有C++的高级知识,我想学习C.

有很多资源可以帮助人们从C到C++,但我没有找到任何有用的东西来做相反的事情.

特别:

  1. 每个C程序员都应该知道广泛使用的通用库(比如boost for C++)吗?
  2. 什么是最重要的C语言(如RAII for C++)?
  3. 我应该学习C99并使用它,还是坚持使用C89?
  4. C++开发人员的任何陷阱/陷阱?
  5. 还有什么有用的知道吗?

qua*_*ark 27

这里已经有了很多,所以也许这只是一个小小的补充,但我发现这是最大的差异.

图书馆:

  • 我把它放在第一位,因为在我看来这是实践中最大的不同.C标准库非常(!)稀疏.它提供最低限度的服务.对于其他一切你必须自己动手或找到一个可以使用的库(很多人都可以).你有文件I/O和一些非常基本的字符串函数和数学.对于其他一切,您必须自己动手或找到要使用的库.我发现当从C++转移到C时,我会错过扩展容器(尤其是地图),但还有很多其他容器.

成语:

  • 两种语言都有手动内存(资源)管理,但C++为您提供了一些隐藏需求的工具.在C中你会发现自己更频繁地手工跟踪资源,你必须习惯这一点.具体的实例是数组和字符串(C++ vectorstring为您节省大量的工作),智能指针(你不能真正做到"智能指针"这样的C.你可以做引用计数,但你必须向上和向下的参考重视自己,这是非常容易出错的 - 首先是智能指针被添加到C++中的原因),并且如果习惯了C++编程的现代风格,通常会缺少RAII.
    • 你必须明确建筑和破坏.你可以争论这个缺陷的优点,但结果却有更多的显式代码.
  • 错误处理.C++异常可能很难实现,所以不是每个人都使用它们,但如果你使用它们,你会发现你必须非常注意你如何进行错误通知.需要检查所有重要调用的返回值(有些人会争辩所有调用)需要大量的纪律,而且很多C代码都没有这样做.
  • 字符串(和一般的数组)不具有其大小.你必须在C中传递很多额外的参数来处理这个问题.
  • 如果没有名称空间,您必须仔细管理全局名称空间.
    • class在C++中没有明确将函数绑定到类型.您必须维护一个约定,以便为与类型关联的所有内容添加前缀.
  • 你会看到更多的宏.宏在C中用于许多地方,其中C++具有相同的语言特性,特别是符号常量(C 代替了enum许多旧代码#define),以及泛型(C++使用模板).

建议:

  • 考虑寻找一般用途的扩展库.看看GLibAPR.
    • 即使您不想要一个完整的库,也可以考虑查找一般用途的地图/字典/哈希表.还要考虑捆绑包含大小的裸骨"字符串"类型.
  • 习惯于在所有公共名称上放置模块或"类"前缀.这有点单调乏味,但它可以为您节省很多麻烦.
  • 大量使用前向声明来使类型不透明.在C++中,您可能在标头中有私有数据并且依赖于private阻止访问,在C中您希望尽可能地将实现细节推送到源文件中.(在我看来,你实际上也希望在C++中这样做,但是C使它变得更容易,所以更多的人会这样做.)

    C++揭示了标题中的实现,即使它在技术上隐藏了它在类外的访问.

    // C.hh
    class C
    {
        public:
           void   method1();
           int    method2();
    
       private:
           int    value1;
           char * value2;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    C将"类"定义推送到源文件中.标题是所有前向声明.

    // C.h
    typedef struct C C;           // forward declaration
    
    void c_method1(C *);
    int  c_method2(C *);
    
    // C.c
    struct C
    {
        int    value1;
        char * value2;
    };   
    
    Run Code Online (Sandbox Code Playgroud)


sco*_*chi 12

Glib是现代C的良好起点,让您习惯于不透明类型和半对象定位等概念,这些概念在现代C中是常见的.在频谱的另一端,标准POSIX API是一种"经典"C.

从C++到C的最大差距不是语法,它是成语,就像C++一样,有不同的编程学派.如果您使用设备驱动程序而不是XML解析器,那么您将编写完全不同的C.


And*_*lly 6

Q5.还有什么有用的知道吗?

购买K&R2的副本并阅读.在每页成本的基础上,它可能是您用自己的钱购买的最昂贵的计算书,但它会让您对C及其中的思维过程深表感谢.做练习也会磨练你的技能,让你习惯语言中的可用语言,而不是C++.