0

次の 2 つのファイルがあります。

// first.c
int main(void) {
  putint(3);
}

// second.c
#include <stdio.h>
void putint(int n) {
  printf("%d",n);
  getchar();
}

Win XP で gcc 4.6.1 を実行すると、次のようになります。

gcc first.c second.c -o program.exe

問題なく、stdout に 3 が書き込まれます。first.cputintで宣言する必要はありません。これはどのように可能ですか?これは標準的な動作ですか?

これを MSVC 2008 Express でテストしたところ、期待どおりの宣言でのみ実行されます。

// first.c
void putint(int);
int main(void) {
  putint(3);
}

解決済み、ヒントのおかげで、これらのオプションは警告を表示するのに役立ちました:

  • -暗黙の了解
  • -std=c99 (MinGW 4.6 はデフォルトでgnu90を引き続き使用します)
4

3 に答える 3

2

これは、数十年前には使用されるべきではない C のレガシー「機能」です。このようなことを行った場合に警告する設定のコンパイラを使用する必要があります。Gcc には、使用時に指定する必要があるいくつかのスイッチがあり、そのうちの 1 つが警告を表示します。

編集: 私自身は gcc を使用していませんが、確認すべきスイッチは -pedantic、-Wall、-Wextra、および -std です。

これを受け入れているコンパイラは、古い言語定義に従って、別の方法で伝えるのが適切ではないため、関数 a) は int 値を返し、b) int を渡すため (または渡した場合) と想定しています。 intに昇格できるもの)関数は、その引数がintであると想定しています。

@veerが正しく指摘しているように、これは通常、特定のケースで機能するはずです。ただし、他の場合では、プロトタイプのない関数の暗黙の仮定と関数の実際のシグネチャとの違いにより、事態が好転することがあります。

于 2012-08-30T00:28:34.030 に答える
2

これは MinGW だけでなく、gcc のすべての標準バージョンに適用されます。前述のように、これは C89 では合法です。gcc のデフォルトは 'gnu89' (99 ではない) で、これも警告なしでコードを受け入れます。c99 または gnu99 (またはそれ以降、c11 など) に切り替えると、デフォルトで警告が表示されますが、それでもコンパイルされます。

于 2012-08-30T01:05:36.563 に答える
0

他の人が指摘しているように、これは C 準拠コンパイラの標準的な動作です。ファイルに .c という名前を付けると、部分的に C モードになります。「組み込み関数」(printf() など) やあらゆる種類のレガシー C のような楽しいものがあります。

しかし、私が最近経験した他の人が言ったことに追加したいと思います. MS は、C90 以降の C のサポートを明確に打ち切りました。また、C90 のサポートは控えめに言っても貧弱です。標準の ANSI C90 コードベースが新しい VS でコンパイルされるかどうかは完全にはわかりません。これは基本的に、多くの機能が無効になっている C++ コンパイラであるためです (GCC には実際には C コンパイラがあります)。彼らは C++ を促進するためにこれを行いました。実際の C を使用したい場合、関数の開始時にすべての変数を宣言したい場合などを除き、どのエディションの MS Visual Studio でも実際には実行できません。

于 2012-08-30T02:38:17.663 に答える