C と C++ の両方で有効なコードは、各言語でコンパイルすると異なる動作をする可能性がありますか? 質問する

C と C++ の両方で有効なコードは、各言語でコンパイルすると異なる動作をする可能性がありますか? 質問する

C と C++ には多くの違いがあり、すべての有効な C コードが有効な C++ コードであるとは限りません。
(「有効」とは、定義された動作を持つ標準コード、つまり実装固有/未定義などではないコードを意味します。)

C と C++ の両方で有効なコードを、各言語の標準コンパイラでコンパイルすると異なる動作になるシナリオはありますか?

合理的かつ有用な比較にするために(私は質問の明らかな抜け穴を見つけようとしているのではなく、実際に役立つ何かを学ぼうとしているのです)、次のことを仮定しましょう。

  • プリプロセッサ関連のものはありません (つまり、、#ifdef __cplusplusプラグマなどを使用したハックはありません)
  • 実装定義のものはすべて両方の言語で同じです (例: 数値制限など)
  • 各標準の比較的新しいバージョン (たとえば、C++98 と C90 以降) を比較しています。
    バージョンが重要な場合は、それぞれのどのバージョンで動作が異なるかを明記してください。

ベストアンサー1

以下は、C と C++ における関数呼び出しとオブジェクト宣言の違い、および C90 では宣言されていない関数の呼び出しが許可されているという事実を利用した例です。

#include <stdio.h>

struct f { int x; };

int main() {
    f();
}

int f() {
    return printf("hello");
}

C++ では、一時オブジェクトが作成および破棄されるため何も出力されませんが、C90 では関数は宣言されなくても呼び出すことができるためf出力されます。hello

名前がf2 回使用されていることに疑問をお持ちの場合、C および C++ 標準ではこれが明示的に許可されており、オブジェクトを作成するには、構造が必要な場合は曖昧さを解消し、関数が必要な場合はstruct f省略する必要があります。struct

おすすめ記事