SlideShare a Scribd company logo
Enviar búsqueda
Cargar
Iniciar sesión
Registrarse
C++ tips1 #include編
Denunciar
道化師 堂華
Seguir
5 de Nov de 2011
•
0 recomendaciones
•
6,399 vistas
1
de
31
C++ tips1 #include編
5 de Nov de 2011
•
0 recomendaciones
•
6,399 vistas
Descargar ahora
Descargar para leer sin conexión
Denunciar
Tecnología
主に cppll ML でご紹介してきた tips をC++の仕様をより掘り下げた形でまとめ直してみました。 今回は#includeにフォーカスした内容です。
道化師 堂華
Seguir
Recomendados
C++ tips2 インクリメント編
道化師 堂華
3.3K vistas
•
16 diapositivas
C++ tips 3 カンマ演算子編
道化師 堂華
6.2K vistas
•
24 diapositivas
C++ tips4 cv修飾編
道化師 堂華
4K vistas
•
48 diapositivas
競技プログラミングのためのC++入門
natrium11321
32.9K vistas
•
63 diapositivas
C++0x総復習
道化師 堂華
4.9K vistas
•
170 diapositivas
C++入門?
tsudaa
3.6K vistas
•
32 diapositivas
Más contenido relacionado
La actualidad más candente
エラーハンドリング
道化師 堂華
2.8K vistas
•
58 diapositivas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
13.1K vistas
•
133 diapositivas
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
2.7K vistas
•
24 diapositivas
templateとautoの型推論
MITSUNARI Shigeo
15K vistas
•
22 diapositivas
君はまだ,本当のプリプロセスを知らない
digitalghost
5.4K vistas
•
33 diapositivas
第1回勉強会スライド
koturn 0;
2.1K vistas
•
104 diapositivas
La actualidad más candente
(20)
エラーハンドリング
道化師 堂華
•
2.8K vistas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
•
13.1K vistas
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
•
2.7K vistas
templateとautoの型推論
MITSUNARI Shigeo
•
15K vistas
君はまだ,本当のプリプロセスを知らない
digitalghost
•
5.4K vistas
第1回勉強会スライド
koturn 0;
•
2.1K vistas
F#によるFunctional Programming入門
bleis tift
•
3.6K vistas
Define and expansion of cpp macro
digitalghost
•
4.2K vistas
第2回勉強会スライド
koturn 0;
•
4K vistas
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
•
5.2K vistas
C++11
京大 マイコンクラブ
•
2.6K vistas
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
•
4.7K vistas
知って得するC#
Shota Baba
•
9.7K vistas
Emcpp0506
Takatoshi Kondo
•
10.6K vistas
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
•
1.7K vistas
yieldとreturnの話
bleis tift
•
7.4K vistas
Better C#の脱却を目指して
bleis tift
•
6.3K vistas
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
•
2.4K vistas
モナドハンズオン前座
bleis tift
•
5.7K vistas
C# 8.0 null許容参照型
信之 岩永
•
2.8K vistas
Destacado
Aula 2 Concordância
2º ano CSR
579 vistas
•
16 diapositivas
Sikeres nemzetközi márkázott alkalmazások
MÖBIUS Mobile Marketing
535 vistas
•
33 diapositivas
Oscars after - party
Makala D.
1.3K vistas
•
43 diapositivas
Mis02 Hc04
Ernst Phaff
531 vistas
•
22 diapositivas
Wie Startups unsere Welt verändern (2015)
Sascha Böhr
1.8K vistas
•
34 diapositivas
電子書刺激擴大閱讀產業
Sophie Pang
989 vistas
•
112 diapositivas
Destacado
(18)
Aula 2 Concordância
2º ano CSR
•
579 vistas
Sikeres nemzetközi márkázott alkalmazások
MÖBIUS Mobile Marketing
•
535 vistas
Oscars after - party
Makala D.
•
1.3K vistas
Mis02 Hc04
Ernst Phaff
•
531 vistas
Wie Startups unsere Welt verändern (2015)
Sascha Böhr
•
1.8K vistas
電子書刺激擴大閱讀產業
Sophie Pang
•
989 vistas
Evolucija Klijenata
Ivan Rečević
•
641 vistas
Latvija 2030, NAP2020 un deklarācijas īstenošanas uzraudzības ziņojums
Pārresoru kordinācijas centrs (PKC)
•
571 vistas
2013 content strategy - EBriks Infotech
EBriks Infotech Pvt. Ltd.
•
548 vistas
Homoeopathic Home Prescribing Class 18th October 2014
Owen Homoeopathics
•
352 vistas
Balonmán touro
davidares1
•
535 vistas
урок знам и мога
Chavdara Veleva
•
1.1K vistas
Climbing Off The Ladder, Before We Fall Off
C4Media
•
1.2K vistas
20120319 aws meister-reloaded-s3
Amazon Web Services Japan
•
1.4K vistas
[KGC 2013] Online Game Security in China
Seungmin Shin
•
1.6K vistas
サーバ構築自動化 On aws sqaleの場合
Ryo Kuroda
•
6.1K vistas
Creatividad o mal gusto de los japoneses.
Emilio Gil (unjubilado)
•
727 vistas
Suzuki adferdin god_uppskrift
Kristinn Örn Kristinsson
•
811 vistas
Similar a C++ tips1 #include編
NumPyが物足りない人へのCython入門
Shiqiao Du
36.7K vistas
•
71 diapositivas
boost - std - C#
Tatsuya Ishikawa
2.9K vistas
•
64 diapositivas
C#勉強会
hakugakucafe
1.6K vistas
•
26 diapositivas
Cython intro prelerease
Shiqiao Du
1.8K vistas
•
23 diapositivas
C++ lecture-0
sunaemon
1.3K vistas
•
57 diapositivas
.NETの自作ツール公開手段
Pierre3 小林
189 vistas
•
22 diapositivas
Similar a C++ tips1 #include編
(20)
NumPyが物足りない人へのCython入門
Shiqiao Du
•
36.7K vistas
boost - std - C#
Tatsuya Ishikawa
•
2.9K vistas
C#勉強会
hakugakucafe
•
1.6K vistas
Cython intro prelerease
Shiqiao Du
•
1.8K vistas
C++ lecture-0
sunaemon
•
1.3K vistas
.NETの自作ツール公開手段
Pierre3 小林
•
189 vistas
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
•
49.2K vistas
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
•
465 vistas
Boost17 cpplinq
miki_hirofumi
•
4K vistas
C++0xの概要(デブサミ2010)
Akira Takahashi
•
1.3K vistas
グリとブランのC++講座 ~c++98(stl)と、ほんのちょっとのc++11~
HEXADRIVE Inc.
•
13.6K vistas
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
•
955 vistas
基礎からC言語 part1
Hiroyuki Ito
•
322 vistas
Unity C#3からC#6に向けて
onotchi_
•
2.3K vistas
研究生のためのC++ no.2
Tomohiro Namba
•
427 vistas
わんくま名古屋 #37 (20151114) TDD道場 #25
Yasuhiko Yamamoto
•
803 vistas
Unity ネイティブプラグインの作成について
Tatsuhiko Yamamura
•
47.8K vistas
新しい並列for構文のご提案
yohhoy
•
29.6K vistas
C++でCプリプロセッサを作ったり速くしたりしたお話
Kinuko Yasuda
•
33.3K vistas
画像処理でのPythonの利用
Yasutomo Kawanishi
•
38.9K vistas
Más de 道化師 堂華
Reflection with xamarin.forms
道化師 堂華
2.2K vistas
•
36 diapositivas
独りガラパゴス開発
道化師 堂華
5K vistas
•
22 diapositivas
エラーハンドリングモデル考察
道化師 堂華
5K vistas
•
32 diapositivas
C++プログラマの為のセキュリティ入門
道化師 堂華
2.9K vistas
•
58 diapositivas
マスタリング バベル
道化師 堂華
1.5K vistas
•
39 diapositivas
並列プログラミング入門!&おさらい!
道化師 堂華
10.5K vistas
•
46 diapositivas
Más de 道化師 堂華
(8)
Reflection with xamarin.forms
道化師 堂華
•
2.2K vistas
独りガラパゴス開発
道化師 堂華
•
5K vistas
エラーハンドリングモデル考察
道化師 堂華
•
5K vistas
C++プログラマの為のセキュリティ入門
道化師 堂華
•
2.9K vistas
マスタリング バベル
道化師 堂華
•
1.5K vistas
並列プログラミング入門!&おさらい!
道化師 堂華
•
10.5K vistas
バグベアード入門
道化師 堂華
•
2.1K vistas
LUCIFERの設計コンセプトと 導入予定の機能紹介
道化師 堂華
•
867 vistas
Último
GraphQLはどんな時に使うか
Yutaka Tachibana
14 vistas
•
37 diapositivas
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
145 vistas
•
12 diapositivas
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
57 vistas
•
20 diapositivas
2023情報処理学会関西支部大会-G12.pdf
KoseiShimoda1
7 vistas
•
11 diapositivas
テスト自動化.pdf
ssuserf8ea02
29 vistas
•
26 diapositivas
磁石内臓イヤリングによる磁力変化を利用したジェスチャ識別
sugiuralab
7 vistas
•
1 diapositiva
Último
(14)
GraphQLはどんな時に使うか
Yutaka Tachibana
•
14 vistas
遠隔お酌IoTLT2309.pptx
Yoshiaki Ito
•
145 vistas
CCoE実践者コミュニティ#1_CCoEが進めるセキュリティカイゼンの旅.pptx
Tomoaki Tada
•
57 vistas
2023情報処理学会関西支部大会-G12.pdf
KoseiShimoda1
•
7 vistas
テスト自動化.pdf
ssuserf8ea02
•
29 vistas
磁石内臓イヤリングによる磁力変化を利用したジェスチャ識別
sugiuralab
•
7 vistas
20230921_IoTLT_vol103_kitazaki_v1.pdf
Ayachika Kitazaki
•
164 vistas
画像生成AIの問題点
iPride Co., Ltd.
•
10 vistas
拡散する画像生成.pdf
NTTDOCOMO-ServiceInnovation
•
44 vistas
ヒアラブルデバイスにおける音漏れ信号を用いた空中ジェスチャ認識
sugiuralab
•
5 vistas
IGDA Japan SIG Audio #20-1 室内・野外でのマイク収録と整音.pdf
IGDA Japan SIG-Audio
•
115 vistas
MLOps Course Slides_JP(配布用).pdf
Yuya Yamamoto
•
118 vistas
CatBoost on GPU のひみつ
Takuji Tahara
•
548 vistas
インフラチームとCCoEの関係.pptx
ssuser5c7ee4
•
20 vistas
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
3.
C++ Tips #INCLUDE
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
12.
インクルードガード 依存関係にあるヘッダファイルをヘッダ ファイル内で#includeしていると、複数の ヘッダファイルを#includeした際に、共通 で依存関係にあるヘッダファイルの #includeが重複し、コンパイラからすると その中で行われる定義も重複することに なりエラーになってしまいます。
C++ Tips 1 #include編 Boost.勉強会 #6 札幌 12
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
21.
インクルードガード::補足 定義だから重複エラーになるのであっ て、宣言だけなら重複エラーになりませ ん。
C++ Tips 1 #include編 Boost.勉強会 #6 札幌 21
22.
意図的な再インクルード ヘッダファイルでいろいろな小細工をしたい場合に意 図的に再インクルードさせる場合などもあります。
躊躇無く複数のヘッダファイルを使える状況下ではまず必 要になることはないテクニックです。 このテクニックを利用する場合、#pragma once などに頼ら ず自前で且つ適切にインクルードガードを行う必要があり ます。 特定のマクロ群のOn/Offを切り替えさせる為。 ひとつのヘッダファイルに複数の機能を持たせる為。 マクロの指定により異なる内容のヘッダファイルのように振 る舞わせたり。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 22
23.
ソースファイルのインクルード C++のテンプレートの機能を使ったコード を書くと一般的にはソースファイルに書
くべきコードまでヘッダファイルに書か ざるを得ませんが、ソースファイルを ヘッダファイルから #include することで、 形だけは従来どおりにヘッダファイルと ソースファイルへ書き分けることができ ます。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 23
24.
データファイルのインクルード 移植性が高く且つ超お手軽なデータ埋め 込み方法としても #include
は使えます。 C++ Tips 1 #include編 Boost.勉強会 #6 札幌 24
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編 ご清聴ありがとうございまし た。