13

タイトルが示すように、それらは異なる言語と見なされますか? たとえば、C++ と Objective-C++ の組み合わせを使用してアプリケーションを作成した場合、C++ と Objective-C、C++ と Objective-C++、または 3 つすべてで作成されたと考えますか?

C++ と C は直接互換性がありますが、明らかに C と C++ は異なる言語ですが、Objective-C++ と Objective-C の状況はどうですか?

4

6 に答える 6

11

出典: https://en.wikipedia.org/wiki/Objective-C#Objective-C.2B.2B

Objective-C++ は GNU Compiler Collection のフロントエンドであり、C++ と Objective-C の構文を組み合わせて使用​​するソース ファイルをコンパイルできます。Objective-C++ は、Objective-C が C に追加する拡張機能を C++ に追加します。さまざまな言語機能の背後にあるセマンティクスを統一するために何も行われないため、特定の制限が適用されます。

  • C++ クラスは Objective-C クラスから派生できず、その逆も同様です。
  • C++ 名前空間は、Objective-C 宣言内で宣言できません。
  • Objective-C クラスは、デフォルト コンストラクターを持たない、または 1 つ以上の仮想メソッドを持つ C++ クラスのインスタンス変数を持つことはできませんが、C++ オブジェクトへのポインターはインスタンス変数として無制限に使用できます (-init メソッドで new を使用してそれらを割り当てます)。 )。
  • C++ の「値渡し」セマンティクスは、ポインターを介してのみアクセスできる Objective-C オブジェクトには適用できません。
  • Objective-C 宣言を C++ テンプレート宣言内に置くことはできず、その逆も同様です。ただし、Objective-C 型 (Classname * など) は C++ テンプレート パラメーターとして使用できます。Objective-C と C++ の例外処理は異なります。それぞれのハンドラーは、他のタイプの例外を処理できません。
  • Objective-C と C++ の例外実行時モデルのデストラクタ呼び出し規則が一致しないため、注意が必要です (つまり、Objective-C 例外が C++ オブジェクトのスコープを出ると、C++ デストラクタは呼び出されません)。新しい 64 ビット ランタイムは、この意味で C++ 例外との相互運用性を導入することでこれを解決します。
于 2010-06-15T00:55:26.530 に答える
5

Objective-C++ では、Objective-C と C++ のコードを混在させることができます (注意事項があります)。それ自体は言語ではなく、2 つの言語を混在させるためのメカニズムです。

于 2010-06-15T01:04:41.453 に答える
4

C と C++ は直接互換性がありません。どちらも他方のスーパーセットではありません (ただし、ほとんどの C は有効な C++ です)。Objective-C は C の厳密なスーパーセットであり、Objective-C++ は C++ の厳密なスーパーセットです。これらは、作成できる唯一のステートメントです(簡単に逆にすることを除いて)。

于 2010-06-15T00:58:29.567 に答える
2

適用したい「異なる言語」の定義を理解せずに、この質問に自信を持って答えることは困難です。

Objective-C は C のスーパーセットです。C 言語に追加の構文を追加します。Objective-C++ は、同様に C++ のスーパーセットです。

C と C++ は実際には異なる言語です。C++ は互換性を持つように設計されていますが、一部の C は有効な C++ ではなく、その逆もあります。

つまり、C++ は C とは異なる言語であるため、Objective-C++ は Objective-C とは異なる言語であると言えます。ただし、完全に異なるとは言いません。

于 2010-06-15T00:59:10.390 に答える
2

一見すると、Objective-C++ の方言を使用することは単純なアプローチのように見えます。これは、C++ と Objective-Cを同じコンパイラでマッシュアップした結果であり、堅牢な実装が GCC に存在し、現在は clang になっています。Objective-C と C++ の詳細がどれほど異なるかを考えると、GCC ハッカーは素晴らしい仕事をしています。しかし、C++ のチャンクを導入するために .m ファイルの名前を .mm に変更し始めると、それほど単純ではないことがすぐにわかります。

ヘッダー ファイルと一般的な C プリプロセッサは、C、C++、Objective-C のプログラマにとって、何十年にもわたって頭痛の種でした。言語を混在させようとすると、さらに悪化します。プロジェクトの Objective-C クラスで STL のマップを使用したいとします。私の知る限り、Apple の Foundation ライブラリには、ソートされたツリーベースのマップは含まれていません。たとえば、StyleKit コンポーネントの 1 つはまさにそれを必要とします。したがって、クラスでマップのインスタンス変数を作成するだけで済みます。

#include <map>
@interface MyClass : NSObject {
 @private
 std::map<int, id> lookupTable;
} 
 // ...
@end

ただし、std::map [2] は C++ 対応のコンパイラに対してのみ意味があり、#include [3] の後のみであるため、このヘッダーは Objective-C++ ファイルからのみ #import できます。このクラスを使用するすべてのコードは、Objective-C++ 自体に変換する必要があり、他のヘッダーからインポートすると、プロジェクト全体をすばやく包含するカスケード効果が発生します。

場合によっては、これが許容される場合もあります。ただし、1 つの場所で使用されるライブラリを導入するためだけに、プロジェクト全体またはその大部分を切り替えることは、過剰なだけではありません。複数の Objective-C プログラマーがいるプロジェクトで C++ を知っているのがあなただけなら、これは人気のないアイデアだと思うかもしれません。また、C++ コンパイラを使用して純粋な C コードをコンパイルすることが完全に手間がかからないのと同じように、問題が発生する可能性もあります。さらに、コードが他の Objective-C プロジェクトで自動的に再利用可能ではないことを意味します。

よほど重要でない限り、混同しないほうがよい

Objective C で Objective C++ を使用する戦略、およびその逆の戦略の詳細については、ここをクリックしてください。

于 2013-09-27T10:42:54.430 に答える
1

Objective-C は、おそらく履歴書に記載する正式な用語です。

Objective-C++ は実際には新しい言語ではなく、Objective-C コードが C++ コードと共存できるようにするいくつかのことを指定しているだけです。あなたのアプリが Objective-C と C++、または単に Objective-C++ で書かれていると言うのは、おそらくあなたが望むものです。Objective-C、Objective-C++、C++ をすべて入れるのは冗長です。

于 2010-06-15T01:50:36.553 に答える