SlideShare une entreprise Scribd logo
1  sur  31
Boost.勉強会 #6 札幌 ( 2011-11-05 )

C++ TIPS 1 #INCLUDE編
概要
 主に cppll ML でご紹介してきた tips をC++
  の仕様をより掘り下げた形でまとめ直し
  てみました。
 今回は#includeにフォーカスした内容で
  す。


           C++ Tips 1 #include編 Boost.勉強会 #6 札幌   2
C++ Tips

#INCLUDE
#includeってなに?
 指定されたファイルの内容を#include指令の
 記述の位置に展開する機能です。
  コンパイルの直前にプリプロセスによって展開さ
   れます。
  コンパイラに対して展開するのであって元のファ
   イルは書き換わりません。
  ISO/IEC 14882 では 2003 年版および 2011 年版とも
   に§16.2 Source file inclusion ( JIS X 3014 では「ソー
   スファイルの取込み」 )で記述されています。
                 C++ Tips 1 #include編 Boost.勉強会 #6 札幌   4
#includeってなに?
【a.h】                                   【展開結果】
inline int nabs(int a)                  …
{                                       inline int nabs(int a)
    return 0 <= a ? -a: a;              {
}                                           return 0 <= a ? -a: a;
                                        }
【a.cpp】
…                                       int main()
#include "a.h"                          {
                                            ...
int main()                              }
{
    ...
}
                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌          5
#includeってなに?
 Java の import や C# の using とは似て非な
 るモノです。
  最近の他言語の類似した機能とその本来の目
   的は似たようなものなのですが、CおよびC++
   の#include指令は仕様上、プリプロセスによっ
   てただ機械的に指定されたテキストファイル
   をその場所にぶちまけるだけです。

            C++ Tips 1 #include編 Boost.勉強会 #6 札幌   6
#includeってなに?
 cppコマンドを使って #include の展開結果
 を確認すると #line 指令も挿入されます。
  この#line指令によりコンパイルエラーの位置
  情報や __FILE__, __LINE__ といったマクロが展
  開前の位置で指し示されるようにします。



           C++ Tips 1 #include編 Boost.勉強会 #6 札幌   7
#includeってなに?
【a.h】                                   【展開結果】
inline int nabs(int a)                  … // ←a.cppの19行目だとします。
{                                       #line 1 "a.h"
    return 0 <= a ? -a: a;              inline int nabs(int a)
}                                       {
                                            return 0 <= a ? -a: a;
【a.cpp】                                 }
…                                       #line 20 "a.cpp"
#include "a.h"
                                        int main()
int main()                              {
{                                           ...
    ...                                 }
}
                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌      8
#includeってなに?
 プリプロセスは #include 指令以外にも
 #define 指令や #if 指令などを処理しま
 す。
 他のヘッダファイルに依存しているヘッ
  ダファイルは必ずその依存先のヘッダ
 ファイルを#includeしておきましょう。
  これをちゃんとやっておかないとメンテナン
  ス性が著しく低下します。 #6 札幌
        C++ Tips 1 #include編 Boost.勉強会   9
#includeってなに?
 #include する時の <hoge.h> と "hoge.h" の違い
   ファイル探索範囲に AとBがあったとして、 <hoge.h> は A
    しか見ないが、 "hoge.h" はまず B を見た上で見つからな
    かったら A からもファイルを探す。
     ただし B はそもそも存在しないことも許されており、その場
      合、ファイル探索範囲の違いはなくなる。
     A と B のファイル探索範囲およびその指定方法は処理系依
      存。
   一般的には時の <hoge.h> は標準ライブラリおよび処理系に
    組み込んだライブラリのヘッダを読み込む場合に使用さ
    れ、 "hoge.h" はユーザープログラムのヘッダを読み込む場
    合に使用されます。

                 C++ Tips 1 #include編 Boost.勉強会 #6 札幌   10
#includeってなに?
 ファイルの指定に利用可能な文字列の種類については
 ISO/IEC 14882 の2003 年版では§2.8 Header names 、 2011 年版
 では同名の§2.9 ( JIS X 3014 では「 §2.8 ヘッダ名 」 )で記述
 されています。
  ISO/IEC 14882 の2003 年版では§2.2 Character sets 、 2011 年版では同
   名の§2.3 ( JIS X 3014 では「 §2.3 文字集合 」 )も参照のこと。
  簡単且つ乱暴にまとめるとASCII文字(タブや改行も含む)は使ってい
   いけど、日本語を直接使用するのはダメで、国際文字名を使いた
   い場合は uXXXX あるいは UXXXXXXXX の形式で指定。( Xは16進数
   文字 )
  例外としてヘッダ名を < と > で囲む場合は > が、二つの " で囲む場
   合は" が使えない。


                    C++ Tips 1 #include編 Boost.勉強会 #6 札幌      11
インクルードガード
 依存関係にあるヘッダファイルをヘッダ
ファイル内で#includeしていると、複数の
ヘッダファイルを#includeした際に、共通
で依存関係にあるヘッダファイルの
#includeが重複し、コンパイラからすると
その中で行われる定義も重複することに
なりエラーになってしまいます。
       C++ Tips 1 #include編 Boost.勉強会 #6 札幌   12
インクルードガード
【a.h】                                   【展開結果】
#include "c.h"                          inline int nabs(int   a)
                                        {
【b.h】
                                            return 0 <= a ?   -a: a;
#include "c.h"
                                        }
【c.h】                                   inline int nabs(int   a)
inline int nabs(int a)                  {
{                                           return 0 <= a ?   -a: a;
    return 0 <= a ? -a: a;              }
}
【a.cpp】                               定義が重複してしまいエラーになる!
#include "a.h"
#include "b.h"
                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌            13
インクルードガード
 そこで出てくるのがインクルードガード
  と呼ばれるテクニックです。
 #if 指令と #define 指令を使って2つ目以
  降は展開されないようにします。



          C++ Tips 1 #include編 Boost.勉強会 #6 札幌   14
インクルードガード
【c.h】                                   【中間展開イメージ】
#if !defined(c_h)                       #if !defined(c_h)
#define c_h                             #define c_h
inline int nabs(int a)                  inline int nabs(int a)
{                                       {
    return 0 <= a ? -a: a;                  return 0 <= a ? -a: a;
}                                       }
#endif                                  #endif
                                        #if !defined(c_h)
【最終展開イメージ】
                                        ここは #if の条件が成立しないので
inline int nabs(int a)
                                        展開されない。
{
                                        #endif
    return 0 <= a ? -a: a;
}
                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌      15
インクルードガード
 インクルードガードで #define するマクロは名前
  はなんでもいいのですが他と名前が被るといろ
  いろまずいことが起きることが予想されますの
  で、まず被らないだろうって名前にする必要が
  あります。
 #includeされる側ではなく#includeする側でイン
  クルードガード行うこともあります。
  #includeする側でインクルードガードするのをどこか
  でうっかり忘れてしまうリスクがあるので多用はされ
  ていないようですが。
           C++ Tips 1 #include編 Boost.勉強会 #6 札幌   16
インクルードガード
【a.h】
#if !defined(c_h)
#define c_h
#include "c.h"
#endif

【b.h】
#if !defined(c_h)
#define c_h
#include "c.h"
#endif


                    C++ Tips 1 #include編 Boost.勉強会 #6 札幌   17
インクルードガード
 拡張仕様で #pragma once と記述しておく
 だけでインクルードガードをやってくれ
 るコンパイラもあります。




          C++ Tips 1 #include編 Boost.勉強会 #6 札幌   18
インクルードガード
【c.h】                                   【c.h】
#if !defined(c_h)                       #pragma once
#define c_h                             inline int nabs(int a)
inline int nabs(int a)                  {
{                                           return 0 <= a ? -a: a;
    return 0 <= a ? -a: a;              }
}
#endif




                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌          19
インクルードガード::使い分け
 コンパイルの速度的には#pragma once や#includeする
  側で行う手製インクルードガードがよいとされていま
  す。
 移植性の面では#includeされる側で行う手製インク
  ルードガードがベストです。
 直接は手を入れたくないあるいは手を入れられない第
  三者から提供されるヘッダファイルにインクルード
  ガードが施されていない場合は#includeする側で行う
  手製インクルードガードしかありません。
  手製インクルードガードでラップしたヘッダファイルを使
   うのもありです。
              C++ Tips 1 #include編 Boost.勉強会 #6 札幌   20
インクルードガード::補足
 定義だから重複エラーになるのであっ
て、宣言だけなら重複エラーになりませ
ん。




       C++ Tips 1 #include編 Boost.勉強会 #6 札幌   21
意図的な再インクルード
 ヘッダファイルでいろいろな小細工をしたい場合に意
 図的に再インクルードさせる場合などもあります。
  躊躇無く複数のヘッダファイルを使える状況下ではまず必
   要になることはないテクニックです。
  このテクニックを利用する場合、#pragma once などに頼ら
   ず自前で且つ適切にインクルードガードを行う必要があり
   ます。
  特定のマクロ群のOn/Offを切り替えさせる為。
  ひとつのヘッダファイルに複数の機能を持たせる為。
   マクロの指定により異なる内容のヘッダファイルのように振
    る舞わせたり。

            C++ Tips 1 #include編 Boost.勉強会 #6 札幌   22
ソースファイルのインクルード
 C++のテンプレートの機能を使ったコード
 を書くと一般的にはソースファイルに書
 くべきコードまでヘッダファイルに書か
 ざるを得ませんが、ソースファイルを
 ヘッダファイルから #include することで、
 形だけは従来どおりにヘッダファイルと
 ソースファイルへ書き分けることができ
 ます。
         C++ Tips 1 #include編 Boost.勉強会 #6 札幌   23
データファイルのインクルード
 移植性が高く且つ超お手軽なデータ埋め
込み方法としても #include は使えます。




        C++ Tips 1 #include編 Boost.勉強会 #6 札幌   24
データファイルのインクルード
…
int data[] = {
#include "data.csv" // 42,42,42,
};
…




                       C++ Tips 1 #include編 Boost.勉強会 #6 札幌   25
ストリームのインクルード
 役に立つことはまずないですが /dev/tty
 (linux)だの con (windows)だのといったスト
 リームをインクルードすることも可能で
 す。
  プロンプトの類いが出せないのが辛いところ
  です。


           C++ Tips 1 #include編 Boost.勉強会 #6 札幌   26
ストリームのインクルード
…
int confidential_value = // この値はコンパイル時に手入力する。
#if defined(__WIN32__) || defined(_WIN32)
#include <con>
#else
#include <dev/tty>
#endif
;
…




                 C++ Tips 1 #include編 Boost.勉強会 #6 札幌   27
#include __FILE__ について
 そのファイル自身をインクルードしよう
 として #include __FILE__ とするのは構文
 的は間違いではないが、規格上も実際も
 #include で指定する形式と __FILE__ が一
 致している保証がなく、またカレント
 ディレクトリの扱いが処理系によって異
 なる問題もある為、規格的には有効に機
 能する保証はない。
           C++ Tips 1 #include編 Boost.勉強会 #6 札幌   28
#line
   明示的に利用することで次のようなことができます。
       コンパイル環境の物理的なファイルパスの隠蔽。
         __FILE__ がどのような形のナロー文字列になっているのかは処理系依存。
         ユーザー名が含まれるパスでコンパイルして実行形式ファイルに __FILE__ と
          して埋め込まれる事態を防げます。
       同じファイル内でのブロックの明示。
         __function__ 疑似マクロなどが使える場合はあまりその必要性はありません
          が。
   #line で指定できる行番号は C++03だと 1~32,767 の範囲で C++11だ
    と1~2,147,483,647の範囲になります。この値域から外れる数値が
    指定された場合の動作は未定義となります。
   ISO/IEC 14882 では 2003 年版および 2011 年版ともに§16.4 Line control ( JIS X 3014
    では「行制御」 )で記述されています。


                           C++ Tips 1 #include編 Boost.勉強会 #6 札幌             29
C++ Tips 1 #include編

質疑応答
C++ Tips 1 #include編

ご清聴ありがとうございまし
た。

Contenu connexe

Tendances

エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macrodigitalghost
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指してbleis tift
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Keisuke Fukuda
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 

Tendances (20)

エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
Define and expansion of cpp macro
Define and expansion of cpp macroDefine and expansion of cpp macro
Define and expansion of cpp macro
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
C++11
C++11C++11
C++11
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Emcpp0506
Emcpp0506Emcpp0506
Emcpp0506
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 

En vedette

Aula 2 Concordância
Aula 2 ConcordânciaAula 2 Concordância
Aula 2 Concordância2º ano CSR
 
Sikeres nemzetközi márkázott alkalmazások
Sikeres nemzetközi márkázott alkalmazásokSikeres nemzetközi márkázott alkalmazások
Sikeres nemzetközi márkázott alkalmazásokMÖBIUS Mobile Marketing
 
Oscars after - party
Oscars after - partyOscars after - party
Oscars after - partyMakala D.
 
Wie Startups unsere Welt verändern (2015)
Wie Startups unsere Welt verändern (2015) Wie Startups unsere Welt verändern (2015)
Wie Startups unsere Welt verändern (2015) Sascha Böhr
 
電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業Sophie Pang
 
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojumsLatvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojumsPārresoru kordinācijas centrs (PKC)
 
Homoeopathic Home Prescribing Class 18th October 2014
Homoeopathic Home Prescribing Class 18th October 2014Homoeopathic Home Prescribing Class 18th October 2014
Homoeopathic Home Prescribing Class 18th October 2014Owen Homoeopathics
 
Balonmán touro
Balonmán touroBalonmán touro
Balonmán tourodavidares1
 
урок знам и мога
урок знам и могаурок знам и мога
урок знам и могаChavdara Veleva
 
Climbing Off The Ladder, Before We Fall Off
Climbing Off The Ladder, Before We Fall OffClimbing Off The Ladder, Before We Fall Off
Climbing Off The Ladder, Before We Fall OffC4Media
 
[KGC 2013] Online Game Security in China
[KGC 2013] Online Game Security in China[KGC 2013] Online Game Security in China
[KGC 2013] Online Game Security in ChinaSeungmin Shin
 
サーバ構築自動化 On aws sqaleの場合
サーバ構築自動化 On aws   sqaleの場合サーバ構築自動化 On aws   sqaleの場合
サーバ構築自動化 On aws sqaleの場合Ryo Kuroda
 
Creatividad o mal gusto de los japoneses.
Creatividad o mal gusto de los japoneses.Creatividad o mal gusto de los japoneses.
Creatividad o mal gusto de los japoneses.Emilio Gil (unjubilado)
 

En vedette (18)

Aula 2 Concordância
Aula 2 ConcordânciaAula 2 Concordância
Aula 2 Concordância
 
Sikeres nemzetközi márkázott alkalmazások
Sikeres nemzetközi márkázott alkalmazásokSikeres nemzetközi márkázott alkalmazások
Sikeres nemzetközi márkázott alkalmazások
 
Oscars after - party
Oscars after - partyOscars after - party
Oscars after - party
 
Mis02 Hc04
Mis02 Hc04Mis02 Hc04
Mis02 Hc04
 
Wie Startups unsere Welt verändern (2015)
Wie Startups unsere Welt verändern (2015) Wie Startups unsere Welt verändern (2015)
Wie Startups unsere Welt verändern (2015)
 
電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業電子書刺激擴大閱讀產業
電子書刺激擴大閱讀產業
 
Evolucija Klijenata
Evolucija KlijenataEvolucija Klijenata
Evolucija Klijenata
 
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojumsLatvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
 
2013 content strategy - EBriks Infotech
2013 content strategy - EBriks Infotech2013 content strategy - EBriks Infotech
2013 content strategy - EBriks Infotech
 
Homoeopathic Home Prescribing Class 18th October 2014
Homoeopathic Home Prescribing Class 18th October 2014Homoeopathic Home Prescribing Class 18th October 2014
Homoeopathic Home Prescribing Class 18th October 2014
 
Balonmán touro
Balonmán touroBalonmán touro
Balonmán touro
 
урок знам и мога
урок знам и могаурок знам и мога
урок знам и мога
 
Climbing Off The Ladder, Before We Fall Off
Climbing Off The Ladder, Before We Fall OffClimbing Off The Ladder, Before We Fall Off
Climbing Off The Ladder, Before We Fall Off
 
20120319 aws meister-reloaded-s3
20120319 aws meister-reloaded-s320120319 aws meister-reloaded-s3
20120319 aws meister-reloaded-s3
 
[KGC 2013] Online Game Security in China
[KGC 2013] Online Game Security in China[KGC 2013] Online Game Security in China
[KGC 2013] Online Game Security in China
 
サーバ構築自動化 On aws sqaleの場合
サーバ構築自動化 On aws   sqaleの場合サーバ構築自動化 On aws   sqaleの場合
サーバ構築自動化 On aws sqaleの場合
 
Creatividad o mal gusto de los japoneses.
Creatividad o mal gusto de los japoneses.Creatividad o mal gusto de los japoneses.
Creatividad o mal gusto de los japoneses.
 
Suzuki adferdin god_uppskrift
Suzuki adferdin  god_uppskriftSuzuki adferdin  god_uppskrift
Suzuki adferdin god_uppskrift
 

Similaire à C++ tips1 #include編

NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段Pierre3 小林
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011Hiroh Satoh
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)Akira Takahashi
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
基礎からC言語 part1
基礎からC言語 part1基礎からC言語 part1
基礎からC言語 part1Hiroyuki Ito
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25Yasuhiko Yamamoto
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてTatsuhiko Yamamura
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話Kinuko Yasuda
 
画像処理でのPythonの利用
画像処理でのPythonの利用画像処理でのPythonの利用
画像処理でのPythonの利用Yasutomo Kawanishi
 
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013Kiyoshi Ogawa
 

Similaire à C++ tips1 #include編 (20)

NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
C#勉強会
C#勉強会C#勉強会
C#勉強会
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
基礎からC言語 part1
基礎からC言語 part1基礎からC言語 part1
基礎からC言語 part1
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
 
画像処理でのPythonの利用
画像処理でのPythonの利用画像処理でのPythonの利用
画像処理でのPythonの利用
 
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
MISRA-C2012とISO/IEC 9899:2011 at OSCNagoya2013
 

Plus de 道化師 堂華

Reflection with xamarin.forms
Reflection with xamarin.formsReflection with xamarin.forms
Reflection with xamarin.forms道化師 堂華
 
独りガラパゴス開発
独りガラパゴス開発独りガラパゴス開発
独りガラパゴス開発道化師 堂華
 
エラーハンドリングモデル考察
エラーハンドリングモデル考察エラーハンドリングモデル考察
エラーハンドリングモデル考察道化師 堂華
 
C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門道化師 堂華
 
マスタリング バベル
マスタリング バベルマスタリング バベル
マスタリング バベル道化師 堂華
 
並列プログラミング 入門!&おさらい!
並列プログラミング入門!&おさらい!並列プログラミング入門!&おさらい!
並列プログラミング 入門!&おさらい!道化師 堂華
 
LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介道化師 堂華
 

Plus de 道化師 堂華 (8)

Reflection with xamarin.forms
Reflection with xamarin.formsReflection with xamarin.forms
Reflection with xamarin.forms
 
独りガラパゴス開発
独りガラパゴス開発独りガラパゴス開発
独りガラパゴス開発
 
エラーハンドリングモデル考察
エラーハンドリングモデル考察エラーハンドリングモデル考察
エラーハンドリングモデル考察
 
C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門C++プログラマの為のセキュリティ入門
C++プログラマの為のセキュリティ入門
 
マスタリング バベル
マスタリング バベルマスタリング バベル
マスタリング バベル
 
並列プログラミング 入門!&おさらい!
並列プログラミング入門!&おさらい!並列プログラミング入門!&おさらい!
並列プログラミング 入門!&おさらい!
 
バグベアード入門
バグベアード入門バグベアード入門
バグベアード入門
 
LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介LUCIFERの設計コンセプトと 導入予定の機能紹介
LUCIFERの設計コンセプトと 導入予定の機能紹介
 

C++ tips1 #include編

  • 1. Boost.勉強会 #6 札幌 ( 2011-11-05 ) C++ TIPS 1 #INCLUDE編
  • 2. 概要  主に cppll ML でご紹介してきた tips をC++ の仕様をより掘り下げた形でまとめ直し てみました。  今回は#includeにフォーカスした内容で す。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 2
  • 4. #includeってなに?  指定されたファイルの内容を#include指令の 記述の位置に展開する機能です。  コンパイルの直前にプリプロセスによって展開さ れます。  コンパイラに対して展開するのであって元のファ イルは書き換わりません。  ISO/IEC 14882 では 2003 年版および 2011 年版とも に§16.2 Source file inclusion ( JIS X 3014 では「ソー スファイルの取込み」 )で記述されています。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 4
  • 5. #includeってなに? 【a.h】 【展開結果】 inline int nabs(int a) … { inline int nabs(int a) return 0 <= a ? -a: a; { } return 0 <= a ? -a: a; } 【a.cpp】 … int main() #include "a.h" { ... int main() } { ... } C++ Tips 1 #include編 Boost.勉強会 #6 札幌 5
  • 6. #includeってなに?  Java の import や C# の using とは似て非な るモノです。  最近の他言語の類似した機能とその本来の目 的は似たようなものなのですが、CおよびC++ の#include指令は仕様上、プリプロセスによっ てただ機械的に指定されたテキストファイル をその場所にぶちまけるだけです。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 6
  • 7. #includeってなに?  cppコマンドを使って #include の展開結果 を確認すると #line 指令も挿入されます。  この#line指令によりコンパイルエラーの位置 情報や __FILE__, __LINE__ といったマクロが展 開前の位置で指し示されるようにします。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 7
  • 8. #includeってなに? 【a.h】 【展開結果】 inline int nabs(int a) … // ←a.cppの19行目だとします。 { #line 1 "a.h" return 0 <= a ? -a: a; inline int nabs(int a) } { return 0 <= a ? -a: a; 【a.cpp】 } … #line 20 "a.cpp" #include "a.h" int main() int main() { { ... ... } } C++ Tips 1 #include編 Boost.勉強会 #6 札幌 8
  • 9. #includeってなに?  プリプロセスは #include 指令以外にも #define 指令や #if 指令などを処理しま す。  他のヘッダファイルに依存しているヘッ ダファイルは必ずその依存先のヘッダ ファイルを#includeしておきましょう。  これをちゃんとやっておかないとメンテナン ス性が著しく低下します。 #6 札幌 C++ Tips 1 #include編 Boost.勉強会 9
  • 10. #includeってなに?  #include する時の <hoge.h> と "hoge.h" の違い  ファイル探索範囲に AとBがあったとして、 <hoge.h> は A しか見ないが、 "hoge.h" はまず B を見た上で見つからな かったら A からもファイルを探す。  ただし B はそもそも存在しないことも許されており、その場 合、ファイル探索範囲の違いはなくなる。  A と B のファイル探索範囲およびその指定方法は処理系依 存。  一般的には時の <hoge.h> は標準ライブラリおよび処理系に 組み込んだライブラリのヘッダを読み込む場合に使用さ れ、 "hoge.h" はユーザープログラムのヘッダを読み込む場 合に使用されます。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 10
  • 11. #includeってなに?  ファイルの指定に利用可能な文字列の種類については ISO/IEC 14882 の2003 年版では§2.8 Header names 、 2011 年版 では同名の§2.9 ( JIS X 3014 では「 §2.8 ヘッダ名 」 )で記述 されています。  ISO/IEC 14882 の2003 年版では§2.2 Character sets 、 2011 年版では同 名の§2.3 ( JIS X 3014 では「 §2.3 文字集合 」 )も参照のこと。  簡単且つ乱暴にまとめるとASCII文字(タブや改行も含む)は使ってい いけど、日本語を直接使用するのはダメで、国際文字名を使いた い場合は uXXXX あるいは UXXXXXXXX の形式で指定。( Xは16進数 文字 )  例外としてヘッダ名を < と > で囲む場合は > が、二つの " で囲む場 合は" が使えない。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 11
  • 13. インクルードガード 【a.h】 【展開結果】 #include "c.h" inline int nabs(int a) { 【b.h】 return 0 <= a ? -a: a; #include "c.h" } 【c.h】 inline int nabs(int a) inline int nabs(int a) { { return 0 <= a ? -a: a; return 0 <= a ? -a: a; } } 【a.cpp】 定義が重複してしまいエラーになる! #include "a.h" #include "b.h" C++ Tips 1 #include編 Boost.勉強会 #6 札幌 13
  • 14. インクルードガード  そこで出てくるのがインクルードガード と呼ばれるテクニックです。  #if 指令と #define 指令を使って2つ目以 降は展開されないようにします。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 14
  • 15. インクルードガード 【c.h】 【中間展開イメージ】 #if !defined(c_h) #if !defined(c_h) #define c_h #define c_h inline int nabs(int a) inline int nabs(int a) { { return 0 <= a ? -a: a; return 0 <= a ? -a: a; } } #endif #endif #if !defined(c_h) 【最終展開イメージ】 ここは #if の条件が成立しないので inline int nabs(int a) 展開されない。 { #endif return 0 <= a ? -a: a; } C++ Tips 1 #include編 Boost.勉強会 #6 札幌 15
  • 16. インクルードガード  インクルードガードで #define するマクロは名前 はなんでもいいのですが他と名前が被るといろ いろまずいことが起きることが予想されますの で、まず被らないだろうって名前にする必要が あります。  #includeされる側ではなく#includeする側でイン クルードガード行うこともあります。  #includeする側でインクルードガードするのをどこか でうっかり忘れてしまうリスクがあるので多用はされ ていないようですが。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 16
  • 17. インクルードガード 【a.h】 #if !defined(c_h) #define c_h #include "c.h" #endif 【b.h】 #if !defined(c_h) #define c_h #include "c.h" #endif C++ Tips 1 #include編 Boost.勉強会 #6 札幌 17
  • 18. インクルードガード  拡張仕様で #pragma once と記述しておく だけでインクルードガードをやってくれ るコンパイラもあります。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 18
  • 19. インクルードガード 【c.h】 【c.h】 #if !defined(c_h) #pragma once #define c_h inline int nabs(int a) inline int nabs(int a) { { return 0 <= a ? -a: a; return 0 <= a ? -a: a; } } #endif C++ Tips 1 #include編 Boost.勉強会 #6 札幌 19
  • 20. インクルードガード::使い分け  コンパイルの速度的には#pragma once や#includeする 側で行う手製インクルードガードがよいとされていま す。  移植性の面では#includeされる側で行う手製インク ルードガードがベストです。  直接は手を入れたくないあるいは手を入れられない第 三者から提供されるヘッダファイルにインクルード ガードが施されていない場合は#includeする側で行う 手製インクルードガードしかありません。  手製インクルードガードでラップしたヘッダファイルを使 うのもありです。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 20
  • 22. 意図的な再インクルード  ヘッダファイルでいろいろな小細工をしたい場合に意 図的に再インクルードさせる場合などもあります。  躊躇無く複数のヘッダファイルを使える状況下ではまず必 要になることはないテクニックです。  このテクニックを利用する場合、#pragma once などに頼ら ず自前で且つ適切にインクルードガードを行う必要があり ます。  特定のマクロ群のOn/Offを切り替えさせる為。  ひとつのヘッダファイルに複数の機能を持たせる為。  マクロの指定により異なる内容のヘッダファイルのように振 る舞わせたり。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 22
  • 23. ソースファイルのインクルード  C++のテンプレートの機能を使ったコード を書くと一般的にはソースファイルに書 くべきコードまでヘッダファイルに書か ざるを得ませんが、ソースファイルを ヘッダファイルから #include することで、 形だけは従来どおりにヘッダファイルと ソースファイルへ書き分けることができ ます。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 23
  • 25. データファイルのインクルード … int data[] = { #include "data.csv" // 42,42,42, }; … C++ Tips 1 #include編 Boost.勉強会 #6 札幌 25
  • 26. ストリームのインクルード  役に立つことはまずないですが /dev/tty (linux)だの con (windows)だのといったスト リームをインクルードすることも可能で す。  プロンプトの類いが出せないのが辛いところ です。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 26
  • 27. ストリームのインクルード … int confidential_value = // この値はコンパイル時に手入力する。 #if defined(__WIN32__) || defined(_WIN32) #include <con> #else #include <dev/tty> #endif ; … C++ Tips 1 #include編 Boost.勉強会 #6 札幌 27
  • 28. #include __FILE__ について  そのファイル自身をインクルードしよう として #include __FILE__ とするのは構文 的は間違いではないが、規格上も実際も #include で指定する形式と __FILE__ が一 致している保証がなく、またカレント ディレクトリの扱いが処理系によって異 なる問題もある為、規格的には有効に機 能する保証はない。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 28
  • 29. #line  明示的に利用することで次のようなことができます。  コンパイル環境の物理的なファイルパスの隠蔽。  __FILE__ がどのような形のナロー文字列になっているのかは処理系依存。  ユーザー名が含まれるパスでコンパイルして実行形式ファイルに __FILE__ と して埋め込まれる事態を防げます。  同じファイル内でのブロックの明示。  __function__ 疑似マクロなどが使える場合はあまりその必要性はありません が。  #line で指定できる行番号は C++03だと 1~32,767 の範囲で C++11だ と1~2,147,483,647の範囲になります。この値域から外れる数値が 指定された場合の動作は未定義となります。  ISO/IEC 14882 では 2003 年版および 2011 年版ともに§16.4 Line control ( JIS X 3014 では「行制御」 )で記述されています。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 29
  • 30. C++ Tips 1 #include編 質疑応答
  • 31. C++ Tips 1 #include編 ご清聴ありがとうございまし た。