printf 「Hellow World」表示 | ||
1) | Cygwinを起動します。 | |
2) | ソースを格納するディレクトリに移動 | |
cd src でソースを格納するディレクトリに移動します。 |
||
3) | ソース作成 | |
カレントでviエディタを起動して myprintf.c を作成します。(Windowsのメモ帳などで作成してこのフォルダに保存してもよいです)内容は下です。 |
||
#include <stdio.h> int main(void) { printf("Hellow World !!\n"); return 0; } |
||
※空白は半角スペースかタブを入力しますが、どの現場でもコーディング規約がありますのでそれに従ってください。「{」を入れる場所なども規約がある場合あります。intとmainの間は半角スペース1個、includeと<stdio.h>の間、printfの左,returnの左にはタブを入れるのが普通のようです。 |
||
4) | コンパイル | |
下を実行してexeを作成します。 |
||
$ gcc -Wall -o /home/Owner/bin/myprintf /home/Owner/src/myprintf.c |
||
gcc | コンパイラーです。コンパイラーはcc、xcl_r4など環境によっていろいろあります。ソースからexeが生成されるまでに、gcc以外意にもリンカーなどいろいろなプログラムが呼び出されているようです。 | |
-Wall | ワーニングレベルの指定です。コンパイラによってワーニングレベルの指定は異なります。いずれにしてもワーニングレベルは最高にします。コンパイラがいろいろなチェックを行いワーニングを画面に表示してくれます。比較、代入、関数への引数の型のチェックは重要です。型が間違っていることに気がつかずにプログラムを実行すると不具合の原因となります。 | |
-o /home/Owner/bin/myprintf | exeのpathを指定します。/home/Owner/bin/にmyprintf.exeというプログラムを生成します。-oオプションはどんなコンパイラでも同じようです。Unix上ですと「.exe」は付加されません。Unix上のプログラムには拡張子がないのが普通のようです。 | |
/home/Owner/src/myprintf.c |
ソースファイルを指定します。 | |
※makeファイル、シェルプログラム内にpathを記述する場合はルートからのフルパスで指定するように心がけ、[.](カレント)、「../」(カレントとの相対位置)などは使わないようにします。但し、今の場合のテスト用プログラムのコンパイルの場合などは下でも問題ありません。 $ gcc -Wall -o ../bin/myprintf myprintf.c |
||
5) | プログラムの実行 | |
ディレクトリをbinに移動してmyprintf.exeを起動します。 | ||
Owner@FMIL002 ~/src $ cd ../bin Owner@FMIL002 ~/bin $ ls myprintf.exe Owner@FMIL002 ~/bin $ myprintf Hellow World !! Owner@FMIL002 ~/bin |
||
6) | ワーニング例1 | |
#include <stdio.h> の行を削除したソースをコンパイルすると下のワーニングが出力されます。 | ||
/home/Owner/src/myprintf.c:4: warning: implicit declaration of function
`printf' |
||
「(printfの宣言がなかったので)printfの暗黙の宣言(を適用しました)」って意味だと思います。 printfの型宣言はstdio.hにあります。生成されたexeは正常に実行されます。 |
||
7) | ワーニング例2 | |
printfの引数は文字列("Hellow World !!\n")でなければなりませんが、意図的に「1」(数値)にしてにしてみます。 | ||
#include <stdio.h> int main(void) { printf(1); return 0; } |
||
コンパイルするとしたのワーニングが表示されます。exeは作成されます。 | ||
/home/Owner/src/myprintf.c:5: warning: passing arg 1 of `printf' makes pointer from integer without a cast |
||
このexeを実行するとexeが異常終了します。myprintf.exe.stackdump にスタックの内容がダンプさます。myprintf.exe.stackdumpはrmコマンドで削除してください。 | ||
Owner@FMIL002 ~/bin $ myprintf Segmentation fault (core dumped) Owner@FMIL002 ~/bin $ ls myprintf.exe myprintf.exe.stackdump |
||
4節 gccでプログラム生成 printf | 4節 gccでプログラム生成 |