![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
の書式のところに
#define _GNU_SOURCE
という一文があるのですが、これは何をしているのでしょうか。
#defineはマクロを定義するために使用するのは、
知っています。#define _GNU_SOURCEは _GNU_SOURCE のあとに
何も書かれていないのが不自然です。
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重インクルードを防ぐという目的にも使われることを
知りました。
ご回答いただきました皆様方ありがとうございました。
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.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 で定義することで、このような場面で活用できます。
不自然というよりは慣れですかね。→始めてみたのでしょうね。
・以上。参考に。
お探しの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も見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
gccでコンパイル時のエラー
-
空ENTERの判別
-
C++ 平均値、最大値と最小値の...
-
構造体配列のvectorへの変換と...
-
C++でShowCursorを使いたい。
-
構文エラーが出ているのですが...
-
#defineの使い方について
-
指定した文字を削除したい
-
VC++ iostreamの不具合(?)
-
VxWorks 6.4ソケット接続につい...
-
VS2019でofstreamが未定義になる
-
snprintfが使用できない。
-
2重の(?)の#include
-
c++のvirtual関数および継承に...
-
構造体に決められた文字列を入...
-
プログラミング
-
opencvを使って画像比較
-
C言語からgnuplot呼び出し
-
atlbase.h と afxwin.hの同時定義
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
switch文のエラーについて
-
enumの値から定義名を文字列化...
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
空ENTERの判別
-
std::wstringのメモリリークに...
-
C言語からgnuplot呼び出し
-
リモートデスクトップの接続元I...
-
JPEGやPNGが読めるLoadImage関数
-
このプログラミング誰か教えて...
-
プログラミング
-
#include "fstream.h"
-
C++での <iostream.h>と<iostre...
-
std::map の const 修飾について
-
構造体配列のvectorへの変換と...
-
#defineの使い方について
-
VS2019でofstreamが未定義になる
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報