- ベストアンサー
#defineの使い方について
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strdup.3.html の書式のところに #define _GNU_SOURCE という一文があるのですが、これは何をしているのでしょうか。 #defineはマクロを定義するために使用するのは、 知っています。#define _GNU_SOURCEは _GNU_SOURCE のあとに 何も書かれていないのが不自然です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
strdupはISO規格の標準関数にはありません。ただサポートしているコンパイラは 結構あるとは思いますが。 この例の場合ですが、 #define _GNU_SOURCE してから #include <string.h> することによって、GNU固有の拡張が有効になります。 つまりこの場合は、strdup (と他)の宣言が有効になります。 フリーソフトウェア徹底活用講座(17) http://www.cqpub.co.jp/interface/column/freesoft/2004/200408/0.htm GNU コーディング規約: Writing C http://www.sra.co.jp/wingnut/standards/standards-ja_5.html あたりにちょっとだけ説明があります。 シンボルとして定義されていればいいので、具体的な値に対して 行っていないのでしょう。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★あっ、#endif の位置が違った。 サンプル: /* ヘッダファイルの頭 */ #if !defined( _MY_HEAD_ ) #define _MY_HEAD_ # include <stdio.h> # include <stdlib.h> # include <string.h> /* 関数のプロトタイプ宣言など (ヘッダの中身を記述) */ #endif /* 2重 include 防止対策 */ /* End of my.h */ ←ヘッダファイルの最後 ・上記の方が良いね。失礼!
- Oh-Orange
- ベストアンサー率63% (854/1345)
★不自然ではありません。 ・確かに #define はマクロや定数を定義しますが、記号定数の場合は『名前』だけ定義することが できるのです。これを利用することで include ファイルを2重に取り込まなくて良いという方法が 実現できます。便利です。 ・次のそのサンプルを載せます。 サンプル: /* ヘッダファイルの頭 */ #if !defined( _MY_HEAD_ ) #define _MY_HEAD_ # include <stdio.h> # include <stdlib.h> # include <string.h> #endif /* 2重 include 防止対策 */ /* 関数のプロトタイプ宣言など (ヘッダの中身を記述) */ /* End of my.h */ ←ヘッダファイルの最後 解説: ・自作ヘッダに上記のように『#define _MY_HEAD_』とすると最初にインクルードしたときだけ include 文で stdio.h、stdlib.h、string.h の3つがインクルードされます。 二度、自作ヘッダをインクルードしても既に『_MY_HEAD_』が定義されているため、条件式の 『#if !defined( _MY_HEAD_ )』から『#endif』までがカット(飛ば)されます。 ・名前だけの定数を #define で定義することで、このような場面で活用できます。 不自然というよりは慣れですかね。→始めてみたのでしょうね。 ・以上。参考に。
- MASA_H
- ベストアンサー率42% (64/151)
#ifdefには反応するのでそれで十分な場合もあります。
お礼
全部の回答を見まして、 「GNU固有の拡張が有効にする」ためのものだと判断しました。 2重インクルードを防ぐという目的にも使われることを 知りました。 ご回答いただきました皆様方ありがとうございました。