• ベストアンサー

#defineの使い方について

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strdup.3.html の書式のところに #define _GNU_SOURCE という一文があるのですが、これは何をしているのでしょうか。 #defineはマクロを定義するために使用するのは、 知っています。#define _GNU_SOURCEは _GNU_SOURCE のあとに 何も書かれていないのが不自然です。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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 あたりにちょっとだけ説明があります。 シンボルとして定義されていればいいので、具体的な値に対して 行っていないのでしょう。

otaks
質問者

お礼

全部の回答を見まして、 「GNU固有の拡張が有効にする」ためのものだと判断しました。 2重インクルードを防ぐという目的にも使われることを 知りました。 ご回答いただきました皆様方ありがとうございました。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★あっ、#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)
回答No.2

★不自然ではありません。 ・確かに #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)
回答No.1

#ifdefには反応するのでそれで十分な場合もあります。

関連するQ&A