アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://www.linux.or.jp/JM/html/LDP_man-pages/man …

の書式のところに

#define _GNU_SOURCE

という一文があるのですが、これは何をしているのでしょうか。

#defineはマクロを定義するために使用するのは、
知っています。#define _GNU_SOURCEは _GNU_SOURCE のあとに
何も書かれていないのが不自然です。

A 回答 (4件)

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

    • good
    • 0

★不自然ではありません。


・確かに #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 で定義することで、このような場面で活用できます。
 不自然というよりは慣れですかね。→始めてみたのでしょうね。
・以上。参考に。
    • good
    • 1

★あっ、#endif の位置が違った。



サンプル:
/* ヘッダファイルの頭 */
#if !defined( _MY_HEAD_ )
#define _MY_HEAD_
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

/*
関数のプロトタイプ宣言など
(ヘッダの中身を記述)
*/
#endif /* 2重 include 防止対策 */

/* End of my.h */ ←ヘッダファイルの最後

・上記の方が良いね。失礼!
    • good
    • 0

strdupはISO規格の標準関数にはありません。

ただサポートしているコンパイラは
結構あるとは思いますが。

この例の場合ですが、
#define _GNU_SOURCE
してから
#include <string.h>
することによって、GNU固有の拡張が有効になります。
つまりこの場合は、strdup (と他)の宣言が有効になります。

フリーソフトウェア徹底活用講座(17)
http://www.cqpub.co.jp/interface/column/freesoft …
GNU コーディング規約: Writing C
http://www.sra.co.jp/wingnut/standards/standards …

あたりにちょっとだけ説明があります。

シンボルとして定義されていればいいので、具体的な値に対して
行っていないのでしょう。
    • good
    • 0
この回答へのお礼

全部の回答を見まして、
「GNU固有の拡張が有効にする」ためのものだと判断しました。

2重インクルードを防ぐという目的にも使われることを
知りました。

ご回答いただきました皆様方ありがとうございました。

お礼日時:2007/05/05 11:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!