31

現在、私は C と C 標準ライブラリに慣れてきています。後で C++ を使用するときに、この分野の知識が役立つかどうか疑問に思っています。

したがって、C 標準ライブラリによって提供される関数を C++ の設定で使用できるかどうか、また実際に使用することが理にかなっているのかどうか、またその理由を知りたいです。

4

3 に答える 3

48

はい、C++ はもともと、C ライブラリを C++ で簡単に使用できるように設計されています。もちろん、これは少し真実ではありません (特に、C ライブラリがtryorのような C++ キーワードを使用している場合dynamic_cast、それは機能しません。また、C ライブラリに渡された C++ でコーディングされたコールバックが何らかの例外を発生させている場合は、大混乱の可能性あり)。

C++ で C ヘッダー ファイルを使用する標準的な方法は次のとおりです。

 extern "C" {
 #include <some_c_header_file.h>
 };

また、ほとんどの既存のC ヘッダー ファイルは、実際に次のようなものを含むことで C++ と連携するように設計されています。

 #ifdef __cplusplus
 extern "C" {
 #endif

 //// most of the header material goes here, C style

 #ifdef __cplusplus
 }; // end extern "C"
 #endif

実際には、多くの C 標準ヘッダーには、上記のようなものをラップする同等の C++ ヘッダーがあります (および にもnamespace std)。たとえば、C<stdio.h>は C++ですが、多くの場合、<cstdio>本物の C++ ストリーム ( <iostream>)を優先する必要がありprintfますが、通常、-like ルーチンは、gettext(3)と組み合わせてローカライズしやすくなっています。

ただし、C と C++ は非常に異なる言語です。慣用的な C++11 でコーディングする必要があります (標準の C++コンテナークロージャーautoRAIIスマート ポインター、 5 つのルールSFINAE例外無名関数などを使用します)。

一部の標準 C 関数は、慣用的な C++ ではあまり役に立ちません。たとえば、本物のC++ で直接 使用する可能性はほとんどありません(少なくとも、まだ非常に低レベルであり、C++ の精神ではありません)。ヒープ割り当てを手動で処理せずにコンテナーとスマート ポインターを多く使用する可能性が高くなります)。 . しかし、POSIX関数 (特にsyscalls(2) ....) は C++ で非常に便利です。C++ の例外と互換性がない可能性があります。mallocnewlongjmp

ところで、C++ は今世紀に大きく進化しました。C++98 を学ぶのではなく、少なくともC++11 (それらの間には途方もない違いがあります) とおそらくC++14を学びます。最近のコンパイラ ( GCCまたはClang/LLVM )を使用します。2015 年 12 月には、少なくともGCC 5または少なくともClang/LLVM 3.7を意味します。コンパイラですべての警告とデバッグ情報を有効にすることを忘れないでください (例g++ -Wall -Wextra -g -std=c++11)

C++ (少なくとも C++11 を意味する)難しいプログラミング言語であり、C よりもかなり複雑です。その一部を学ぶには数週間の読書が必要であり、優れたコーディング スタイルと規律が不可欠です (C++ では非常にくだらないコードを簡単に書くことができます)。プログラミングから始める: C++ を使用した原則と実践

C しか知らないのであれば、 C++ を学ぶ前にSICPを読んで (そして少し Scheme を勉強して)価値があると思います。

未定義の動作の概念は、C とおそらく C++ の両方で非常に重要です。絶対に理解し (C.Lattner のブログを参照)、回避する必要があります。

また、いくつかの既存のフリー ソフトウェアとそのソース コードを研究 (およびおそらく貢献) することで、多くのことを学ぶことができます。したがって、Linux を使用することをお勧めします。

于 2015-12-16T09:08:23.880 に答える
20

ISO/IEC N3690 (c++ 標準) から段落を引用します。

17.2 C 標準ライブラリ

1 C++ 標準ライブラリは、C 標準ライブラリの機能も利用できるようにし、静的な型の安全性を確保するために適切に調整されています。

だから単純にそうです!

于 2015-12-16T09:29:36.513 に答える