![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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ランキング
-
VC++で文字列から任意の文字を...
-
指定した文字を削除したい
-
#include "fstream.h"
-
C++での <iostream.h>と<iostre...
-
std::wstringのメモリリークに...
-
Cの関数からC++の関数(DLL)を...
-
構造体配列のvectorへの変換と...
-
VHDLのsignedとunsignedの違いは?
-
C++で、テキストファイルを一行...
-
メインプログラムに#include <a...
-
VxWorks 6.4ソケット接続につい...
-
getlineについて
-
string型のフォーマット書式指...
-
clock関数のコンパイルエラーで
-
#defineの使い方について
-
C言語 MACアドレス
-
C++のifstreamの使い方
-
構文エラーが出ているのですが...
-
振分の問題
-
ヘッダーファイルがインクルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
#define中の#のエスケープ
-
なぜ、C++の標準ヘッダをインク...
-
C++で、テキストファイルを一行...
-
C言語のエラーを修正したい
-
gccでコンパイル時のエラー
-
C言語のポインターで詰まっている
-
#include "fstream.h"
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報