53章 事前定義マクロ

http://www.geocities.jp/ky_webid/c/053.html

C言語に予め存在しているマクロというのがあるみたいです。

この章ではそれらのお勉強ということになりますか。

  • __FILE__
  • __LINE__
  • __DATE__
  • __TIME__
  • __STDC__


これだけの種類があるみたいです。

全部四文字なんですね。何か意味はあるんでしょうか。

問題1

__FILE__、__LINE__、__DATE__、__TIME__の値を、テキストファイルに書き出すプログラムを作って下さい。

さっそく書き出してみましょう。

そういえばファイル操作は久しぶりですね。

int main (void) {
    FILE *fp;
    char str[81];
    
    fp = fopen("test.txt","w");
    if ( fp == NULL ) {
        return 1;
    }
    
    fputs(__FILE__ "\n",fp);
    fprintf(fp,"%d\n",__LINE__);
    fputs(__DATE__ "\n",fp);
    fputs(__TIME__ "\n",fp);
    
    fclose(fp);
    return 0;
}
main.c
14
Jun 30 2009
.22:18:13

__LINE__だけint型なので一瞬どうやればいいのか迷ってしまいましたが、fprintfがあったことを思い出してそれでやりました。

なので全部fprintfでもよかったんですが、折角fputsで書いちゃったのでそのままにしました。

答え合わせ

解答例もfprintfを使ってますね。

問題2

#lineディレクティブを使って、__LINE__及び__FILE__の値が変化することを確かめて下さい。

やってみます。

int main () {
    printf("%s %d\n",__FILE__,__LINE__);

#line 100 "test.c"

    printf("%s %d\n",__FILE__,__LINE__);
    return 0;
}
$ main
main.c 6
test.c 101

おお、ちゃんと変わってますね。

問題3

__STDC__の値を実際に出力して確かめてみて下さい。

確かめてみるだけの問題ですね

int main () {
    printf("[%s]",__STDC__);
    return 0;
}
main.c(6) : error C2065: '__STDC__' : 定義されていない識別子です。

おや。定義されてないと出ました。

ちょっとclから__STDC__を設定する方法がわからなかったので今回はこれでよしということにしておきます。