2013-06-01 11 views
25

私はZed ShawのLearn C The Hard Wayを開始しています。 XCodeとコマンドラインツールをダウンロードしました。私は非常に最初のプログラムのコンパイル時にでも:GCC警告:C99で関数 'puts'の暗黙の宣言が無効です

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

を私はこの警告を受ける:

ex1.c:2:1:警告:関数 'プット' の暗黙の宣言はC99 で無効 あります[-Wimplicit-function-declaration]

プログラムは正しくコンパイルされて実行されます。

私はOSX 10.8.3を使用しています。 'gcc -v'と入力すると、

ビルトイン仕様を使用します。ターゲット:i686-apple-darwin11で構成されます。 /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure - 無効化可能 - 検査可能 - エラー - プレフィックス= /アプリケーション/ Xcode.app /Contents/Developer/usr/llvm-gcc-4.2 --mandir =/share/man --enable-languages = c、objc、C++、obj-C++ --program-prefix = llvm- --program-transform-name =/^ [cg] [^ .-] * $/s/$/- 4.2/--with-slibdir =/usr/lib --build = i686-apple-darwin11 --enable-llvm =/private/var /tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix = i686-apple-darwin11- --host = x86_64-apple-darwin11 --target = i686-apple- darwin11 --with-GXX-含ま-dirを=は/ usr /含める/ C++/4.2.1スレッドモデル:POSIXのgccのバージョン4.2.1(アップル社に基づきが5658を構築)(LLVM 2336.11.00を構築)

助けてください。

+0

引数が使用されていないときに 'int main(int argc、char * argv [])'を使用すると、やや愚かです。それは 'int main(void)'または 'int main()'でなくてはなりません。しかし、これは別の日の議論かもしれません。 GCC 5.xはデフォルトのコンパイルモードとしてC11( '-std = gnu11')を使用していることに注意してください。 'clang'(' gcc'と偽った)はC99を使います。 C99とC11の両方とも、(main()を除く)すべての関数を使用する前に宣言する必要があります。 –

答えて

40

あなたは、関数定義をインポートするには、開始時に

#include <stdio.h> 

すなわち

、stdio.hのを含める必要があります。

+2

また、レッスン2では、Zedはincludeステートメントを使って警告を取り除くことができると指摘しています。だから私は正しい答えをあなたに信じています。 – grok12

3

この「本」は、に改名する必要があります。大胆に間違っている意味のない例を続けて、Cを憎むことを学びます。元の例

int main(int argc, char *argv[]) { 
    puts("Hello world."); 
    return 0; 
} 

で、1989年に悪い単なるていただろうが

現代Cでの正しいコードは、プレーンと

#include <stdio.h>  // include the correct header 

int main(void) {   // no need to repeat the argument mantra as they're not used 
    puts("Hello world."); 
}       // omit the return in main as it defaults to 0 anyway 

簡単だろう1999(これは、この回答の執筆の18年前、そしてほぼ同じ年"book"が書かれる前に)、Cの標準が改訂されました。 C99の改訂では、この種類のimplicit function declarationが違法に作られました。naturally it remains illegal in the current revision of the standard (C11)です。したがって即ち#include <stdio.h>を付加(またはint puts(const char*);puts関数を宣言)、#include INGのことなく、関連するヘッダをputsを使用すること制約エラーあります。

制約エラーは、である必要があり、診断メッセージを出力するエラーです。さらに、そのようなプログラムは無効なプログラムとみなされます。しかし、C標準の特有のことは、Cコンパイラも無効なプログラムをコンパイルすることができますが、コンパイラはそれを拒否することもできるということです。したがって、このような例は、初心者にCを教えることになっている本の中で、良い出発点にはなりません。

+0

このリンクは公式の標準ウェブサイト/リポジトリのものですか? – Ungeheuer

+0

@Ungeheuerいいえ、残念ながら、[公式の標準](https://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents)の費用がかかります。これは、その実名** n1570 **によって知られているC11ファイナル*ドラフト*のHTML版です。 –

+0

ありがとうございます。最後の質問。リンク先のWebサイトに以前の基準がありますか?私はそこからナビゲートする方法は見当たりません。 – Ungeheuer