http://www.linux.or.jp/JM/html/LDP_man-pages/man …
の書式のところに
#define _GNU_SOURCE
という一文があるのですが、これは何をしているのでしょうか。
#defineはマクロを定義するために使用するのは、
知っています。#define _GNU_SOURCEは _GNU_SOURCE のあとに
何も書かれていないのが不自然です。
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 で定義することで、このような場面で活用できます。
不自然というよりは慣れですかね。→始めてみたのでしょうね。
・以上。参考に。
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 */ ←ヘッダファイルの最後
・上記の方が良いね。失礼!
No.4ベストアンサー
- 回答日時:
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 …
あたりにちょっとだけ説明があります。
シンボルとして定義されていればいいので、具体的な値に対して
行っていないのでしょう。
全部の回答を見まして、
「GNU固有の拡張が有効にする」ためのものだと判断しました。
2重インクルードを防ぐという目的にも使われることを
知りました。
ご回答いただきました皆様方ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux GNU/Linuxでmanページ書くときおすすめの形式はmanとmdocどっち? 1 2023/08/14 11:49
- UNIX・Linux manページあったら嬉しい? 私はArch GNU/Linuxユーザです。GUIも使っているのですが 1 2023/07/31 13:13
- UNIX・Linux UNIX manページとか見る頻度高いの? 特にCLIばかり使っている人のなかで というかCLIとか 3 2023/05/22 17:06
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- C言語・C++・C# マクロ関数 #define の効果は何ですか? わかりやすく教えて下さい 5 2023/04/05 18:14
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 英語 Another overlooked source of graft contamination i 2 2023/05/02 09:24
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- ASP・SaaS FC2 BLOG <AUDIO TAGを入れプレビューはOk テーンプレートを更新すると ✖ 1 2023/08/14 11:40
- その他(プログラミング・Web制作) プログラムが書けません。 6 2023/01/22 22:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
このプログラミング誰か教えて...
-
ファイル読み込みとmap処理
-
boost::lexical_castで16進数文...
-
enumの値から定義名を文字列化...
-
Linux Ubuntu19.10でQt5.14.1の...
-
ハミング符号の解読について
-
セグメンテーションフォルトが...
-
#include "fstream.h"
-
C言語からgnuplot呼び出し
-
vectorの中にmap
-
Haru PDF Library
-
C++で、テキストファイルを一行...
-
C言語のポインターで詰まっている
-
snprintfが使用できない。
-
winpcapを用いたプログラミング
-
C言語プログラミングにて、関数...
-
JPEGやPNGが読めるLoadImage関数
-
Vectorのポインタが入ったvector
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報