Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語とC++の主な非互換性5選|Cでは動くのにC++でエラーになるコード例

はじめに

C言語とC++は高い互換性を持っていますが、完全に同じというわけではありません。ここでは、Cコンパイラでは問題なくコンパイル・実行できるのに、C++コンパイラではエラーになる代表的な非互換性のケースを、サンプルコードとともに解説します。

1. 旧式(K&Rスタイル)の関数定義

C言語では、引数リストの後ろに引数の型を記述する旧式の構文で関数を定義できます。しかし、この書き方はC++では無効です。

#include<stdio.h>
void my_function(x, y)int x;int y; { // C++では無効
   printf("x = %d, y = %d", x, y);
}
int main() {
   my_function(10, 20);
}

Cでの実行結果:

x = 10, y = 20

C++でのエラー:

'x' と 'y' がこのスコープで宣言されていません

2. 型指定を省略した変数宣言

C言語や一部の古いC++コンパイラでは、型を省略した変数はデフォルトでint型として扱われます。しかし、現行のC++では型の省略は許されず、エラーになります。

#include<stdio.h>
main() {
   const x = 10;
   const y = 20;
   printf("x = %d, y = %d", x, y);
}

Cでの実行結果:

x = 10, y = 20

C++でのエラー:

'x' does not name a type
'y' does not name a type

3. externなしでのグローバル変数の複数宣言

C言語では、externキーワードを使わなくても、グローバル変数を複数回宣言できます。Cコンパイラはこれらの宣言(仮定義)を1つの定義として扱います。一方、C++では再定義エラーとなります。

#include<stdio.h>
int x;
int x;
int main() {
   x = 10;
   printf("x = %d", x);
}

Cでの実行結果:

x = 10

C++でのエラー:

int x の再定義(Redefinition of 'int x')

4. voidポインタから任意のポインタ型への暗黙的変換

C言語では、voidポインタを任意のポインタ型の変数にそのまま代入・初期化できます。malloc()の戻り値をキャストなしで使えるのはこのためです。C++では明示的な型変換(キャスト)が必要です。

#include<stdio.h>
#include<malloc.h>
void my_function(int n) {
   int* ptr = malloc(n* sizeof(int)); // void*からint*への暗黙的変換
   printf("Array created. Size: %d", n);
}
main() {
   my_function(10);
}

Cでの実行結果:

Array created. Size: 10

C++でのエラー:

void* から int* への無効な変換

5. 引数リストが空の関数への引数渡し

C言語では、引数リストが空の関数に対して、任意の数・任意の型の引数を渡すことができます(引数の型チェックが行われないため)。C++では、空の引数リストは「引数なし」を意味するため、エラーになります。

#include<stdio.h>
void my_function() {
   printf("Inside my_function");
}
main() {
   my_function(10, "Hello", 2.568, 'a');
}

Cでの実行結果:

Inside my_function

C++でのエラー:

関数 'void my_function()' に渡す引数が多すぎます

まとめ

このように、CとC++には細かい部分でいくつもの非互換性が存在します。CのコードをC++でもコンパイルできるようにしたい場合は、関数プロトタイプの明示、変数の型指定、voidポインタの明示的キャスト、引数の整合性などに注意しましょう。

  1. C++とC#はどちらが速い?パフォーマンスと特徴を徹底比較

    プログラミング言語を選ぶ際、「処理速度」は多くの開発者が気になるポイントです。本記事では、C++とC#という2つの代表的なオブジェクト指向言語を取り上げ、それぞれの特徴や違い、パフォーマンスの差について詳しく解説します。 C++とは C++は中級レベル(ミドルレベル)のプログラミング言語で、1979年にビャーネ・ストロヴストルップ(Bjarne Stroustrup)によって開発されました。C言語を拡張した形であり、低レベルのハードウェア操作から高レベルの抽象化まで幅広く対応できる点が大きな魅力です。オブジェクト指向プログラミングにも完全に対応しています。 C#とは C#は、アンダース・ヘルス

  2. C++とC#の違いとは?メモリ管理・実行速度・継承などを徹底比較

    C++とはC++は、静的型付けのコンパイル型言語であり、大文字と小文字を区別する自由形式の汎用プログラミング言語です。手続き型・オブジェクト指向・ジェネリックといった複数のプログラミングパラダイムをサポートしており、OSやゲームエンジン、組み込みシステムなど幅広い分野で活用されています。C++は、高水準言語の生産性と低水準言語ならではのハードウェア制御能力を兼ね備えていることから、「中級言語(ミドルレベル言語)」と位置づけられることもあります。C#とはC#は、マイクロソフトがアンダース・ヘルスバーグ(Anders Hejlsberg)の主導のもと、.NET構想の一環として開発した、シンプルでモ