2013/09/18

main 関数の書き方

こちらの記事に触発されて、 C で同じお題のプログラム (echo (1) のサブセット)を書いてみた。

main には殆ど処理を記述せずに パラメタ解析や割り込みなどの初期設定のみをしてから、 実際のメイン処理(この場合は echo)を実行するというスタンスは同じです。
ただし、今回の例で言えば getopt(3) を利用して オプション解析を済ませた(実際に echo 出力する)パラメタ群のループは main 側で行う方が好きかな。

  1#include    <stdio.h>
  2#include    <unistd.h>
  3
  4void    echo(const char *p, int nonl)
  5{
  6
  7    /*
  8     * ここは以下の様にすると printf(3)、putchar(3) の呼び出しを
  9     * printf(3) の呼び出しのみに変更できソースもスッキリする。
 10     * 1 文字の出力を '%s' で変換する無駄が微妙に気になるのだが、
 11     * どちらかと言えば改行を出力する事の方が多いと思うので
 12     * putchar(3) の呼び出しがない方が良いのか
 13
 14     printf("%s%s", p, nonl ? "" : "\n");
 15
 16     */
 17
 18    printf("%s", p);
 19    if(!nonl)
 20        putchar('\n');
 21
 22}
 23
 24int     main(int argc, char *argv[])
 25{
 26
 27    int     i,
 28            nonl = 0;
 29
 30    while((i = getopt(argc, argv, "n")) != EOF){
 31        switch(i){
 32            case 'n':
 33                nonl = 1;
 34                break;
 35
 36            default:
 37                break;
 38        }
 39    }
 40
 41    for(i=optind; i<argc; i++)
 42        echo(argv[i], nonl);
 43
 44    exit(0);
 45
 46}
    


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.