SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Define and Expansion of CPP Macro
Cプリプロセッサマクロの定義と展開
2014/06/28
ドワンゴC++勉強会 #1
でちまる
自己紹介
● でちまる
● @decimalbloat
● 仕事
– 艦これコンテンツの回収と観賞
– ツイッター上で見かけた不思議C++コードを見て実装を
看破する
– Android上でJavaを書く(web系ではない)
本日の発表は
● constexpr
● Cプリプロセッサ
● C++老害トーク
● どれも明日から職場で即実践できる話ばかり
● 是非ご活用ください
今日の話
● Cプリプロセッサメタプログラミングについて
● Cプリプロセッサメタプログラミングの技法
Cプリプロセッサメタプログラミング
について
Cプリプロセッサメタプログラミングとは
● Cプリプロセッサで(主にC++の)コードを出力する
プログラムを書く行為
● C++の構文木や意味論などは一切無視して字句
レベルでプログラムを生成する
● やってることとしてはsedとかawkと変わらない
10個の連番の関数を宣言する例
● #define F(z, i, d) 
void BOOST_PP_CAT(f, i)(int);
BOOST_PP_REPEAT(10, F, ~)
→ void f0(int); void f1(int); …… void f9(int);
● 実際に void f0(int); … とかいうのがソースに書か
れている,と扱われる
使いどころ
● 他の言語機能で解決できないケース
● 例: Scope Exit
– 即席RAIIのためのマクロ
– 簡単にいうと次のようなもの
Scope Exit の簡単な実装
#define SCOPE_EXIT 
scope_exit_t BOOST_PP_CAT(scope_exit_var, __LINE__) = [&]
struct scope_exit_t {
std::function<void()> f;
template<typename F>
scope_exit_t(F f) : f(f) {}
~scope_exit_t() { f(); }
};
int main() {
SCOPE_EXIT { std::cout << "hogen"; };
SCOPE_EXIT { std::cout << "fuga, "; };
}
→ fuga, hoge
Scope Exit の簡単な実装
● RAIIで必要な処理をさせるためにはそれ用の変数
もしくはクラスに名前を付ける必要がある
● しかし単にデストラクタを呼ぶだけなので,人間側
の都合としてはどうでもよい
●
そんなわけでこういうマクロを書けば余計な名前を
考える手間もコード上のノイズも減る
よく言われる問題
野蛮
● 何事も暴力で解決するのが一番だ
――NINJASLAYER より レッドゴリラ=サン
● CプリプロセッサはC++の構文も意味論も理解しな
い
● まーでもこれ以外ないから暴力で解決だ
では構文を解すればよいのでは?
● ついこの間提案された
● http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2014/n3883
.html
● 10年単位で待てばいけるかもしれない
名前が衝突する
● BOOST_PP_ とかそういうprefix付ければ普通衝
突しない
● それでも衝突するのはただの当たり屋では?
コンパイルエラーがひどい
● はい
● ただしそれは関数マクロでやった場合の話
● include主体でやればそうでもない(後述しようと
思ったが時間がなくなった)
制限が多い
● はい
● 再帰展開できないとかそういうのがある
● そもそも,アプリケーション開発でコード生成が必
要になったのなら別にCプリプロセッサでなくPHPと
かPerlとかでよい
● わざわざCプリプロセッサでやるのは,PHPがない
環境でもコード生成したいから
ここまでのまとめ
● PHP使えよ
Cプリプロセッサメタプログラミング
の技法
選べる2つのスタイル
● 関数マクロ濫用スタイル
● include濫用スタイル(こっちの話はしない)
関数マクロ濫用スタイルにおける基本
的な技法
●
基本
– 連結と再展開
– 評価順の制御
– 引数の解体
● 応用
– 数値と真理値
– 分岐
– 繰り返し
– データ構造
基本
連結と再展開
● #define CAT(a, b) a ## b
#define AB C
CAT(A, B)
→C
● 連結してできたトークンをマクロ名として定義してお
くことで,更に展開する
評価順の制御
● #define CAT(a, b) a ## b
CAT(A, CAT(B, C))
ACAT(B, C)
● マクロの置換規則はC++の関数とは大きく違うの
でなかなか分かりづらい
評価順の制御
● 置換の基本は
– 外側のマクロを置き換えてから,
– トークン連結して,
– それぞれの引数を個別に置換して,
– 元の場所に挿入して,
– その場所からもう一度置換する
評価順の制御
● #define CAT(a, b) a ## b
CAT(A, CAT(B, C))
→ACAT(B, C)
● 外側のマクロを置き換えると A ## CAT(B, C)
● 連結すると ACAT(B, C) なので引数としては扱わ
れなくなる
評価順の制御
● #define CAT(a, b) CAT_I(a, b)
#define CAT_I(a, b) a ## b
ーCAT(A, CAT(B, C))
→ABC
● 外側のマクロを置き換えると CAT_I(A, CAT(B, C))
●
トークン連結はないのでそのまま
● 引数について展開する(CATが意図通り動くとする)と CAT_I(A, BC)
●
元の場所に戻してそこからもう一度置換する
● 外側のマクロを置き換えると A ## BC
● 連結して ABC
●
以下省略
引数の解体
● #define REM(...) __VA_ARGS__
#define AP(f, x) f(42, x)
#define F(n, x) F_I(n, REM x)
#define F_I(n, x) F_II(n, x)
#define F(n, x, y, z)
AP(F, (A, B, C))
→
● カッコで包めば一つの引数にできるので,任意長
のarityのマクロを固定長引数のマクロの中で扱え
る
● このマクロの置換がどのように行われるかは自明
なので,手順は読者の課題とする(放棄)
応用
数値と真理値
● Cプリプロセッサには数値という概念はない
● (一部の文脈を除く)
● ソースコード上に現われる1とか2とかいうトークン
を数値として扱うことにする
● 同様に0と1をそれぞれtrueとfalseとして扱うことに
する
● マクロの上でどうやってそれらを数値や真理値とみ
なすのかは次のページで
分岐
● 分岐は基本的な技法だけで書ける
● #define IF(c, t, f) CAT(IF, c)(t, f)
#define IF1(t, f) t
#define IF0(t, f) f
IF(1, hoge, fuga)
→hoge
IF(0, hoge, fuga)
→fuga
分岐
● IFと1または0を連結することでそれが再度マクロ名となることで,
二つのマクロ (IF1, IF0) を使い分ける
● C風の数値から整数への変換も次のように書ける
● #define BOOL(n) CAT(BOOL, n)
#define BOOL0 0
#define BOOL1 1
#define BOOL2 1
#define BOOL3 1
…
BOOL(3)
→1
分岐
● IFと組み合わせればCのif風のものもできる
● #define IF2(n, t, f) IF(BOOL(n), t, f)
数値計算
● とりあえず1加算するマクロだけ作る
● #define INC(n) INC ## n
#define INC0 1
#define INC1 2
#define INC2 3
…
INC(INC(2))
→4
● やってることはBOOLと同じ
繰り返し
● 汎用の繰り返しマクロを作るにはいくつかの方法
があるが,全てについて
● 「どの繰り返しマクロも同じようなことを何個もコピ
ペして書いている」
● というのは共通している
繰り返し
●
最も単純な実装
● #define REPEAT(n, m) REPEAT ## n(m)
#define REPEAT0(m)
#define REPEAT1(m) m(0)
#define REPEAT2(m) REPEAT1(m) m(1)
#define REPEAT3(m) REPEAT2(m) m(2)
#define F(n) hoge ## n
REPEAT(3, F)
→hoge0 hoge1 hoge2
● mを関数マクロとみなすことで,繰り返す内容を自由に指定で
きる
繰り返し
●
もっと複雑なもの
● #define WHILE WHILE0
#define WHILE_END(p, st, op) st
#define WHILE0(p, st, op) 
IF(p(st), WHILE1, WHILE_END)(p, st, op)
#define WHILE1(p, st, op) 
IF(p(op(st)), WHILE2, WHILE_END)(p, op(st), op)
#define WHILE2(p, st, op) 
IF(p(op(st)), WHILE3, WHILE_END)(p, op(st), op)
#define WHILE3(p, st, op) 
IF(p(op(st)), WHILE4, WHILE_END)(p, op(st), op)
…
● p(st)が偽だったらst
● 真だったらop(st)した結果で同じことを繰り返す
繰り返し
● 次のように使う(DECはINCの逆として定義したマク
ロとする)
● #define ADD(m, n) ADD_I WHILE(P, (m, n), OP)
#define P(st) P_I st
#define P_I(m, n) BOOL(m)
#define OP(x) OP_I x
#define OP_I(m, n) (DEC(m), INC(n))
ADD(3, 4)
→7
注意
● 今まで見てきた繰り返しマクロは,引数のマクロ
(ループ内で使うマクロ)の中で同繰り返しマクロを
使うことができない
● そんなわけでこの制限を出し抜くために次のような
技法が考案された
● http://www.slideshare.net/digitalghost/c-
35069539
データ構造
● いくつかあるがよく使われているのは次の二つ
– (a)(b)(c)
– (a, b, c)
Sequence
● (a)(b)(c) というような形式を sequenceと言う
● 先頭または末尾への要素の追加,削除はO(1)で
できるが要素へのアクセスはO(N)なデータ構造
Sequence
● コード例はオンラインで
Tuple
● (a, b, c) のような形式をtupleという
● 長さを変更できないが要素へのアクセスはO(1)な
データ構造
– だった
● C++11からVariadic Macroが導入されたので長さ
の制限がなくなった
Tuple
● コード例はオンラインで
データ構造
● だいたいこの2つがあればまともなプログラムが書
ける
● いずれのデータ構造用の関数マクロも,ループ同
様職人が丹精こめて書き上げたコピペ手直しコー
ドでできている
まとめ
● PHPを使え
● 置換とトークン連結だけでも足し算は作れる
● たとえ貧弱な機能でも人間は濫用する.
抵抗は無意味だ
参考になるソースコード
● http://boost.org/
● https://github.com/dechimal/desalt
質疑応答
終わり

Contenu connexe

Tendances

トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法Kumazaki Hiroki
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料SECCON Beginners
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃trmr
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法Hirokatsu Kataoka
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
強化学習 DQNからPPOまで
強化学習 DQNからPPOまで強化学習 DQNからPPOまで
強化学習 DQNからPPOまでharmonylab
 
論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"Yuta Koreeda
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたことMITSUNARI Shigeo
 
畳み込みニューラルネットワークの高精度化と高速化
畳み込みニューラルネットワークの高精度化と高速化畳み込みニューラルネットワークの高精度化と高速化
畳み込みニューラルネットワークの高精度化と高速化Yusuke Uchida
 
実践イカパケット解析α
実践イカパケット解析α実践イカパケット解析α
実践イカパケット解析αYuki Mizuno
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15Shuyo Nakatani
 

Tendances (20)

トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
katagaitai workshop #7 crypto ナップサック暗号と低密度攻撃
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
強化学習 DQNからPPOまで
強化学習 DQNからPPOまで強化学習 DQNからPPOまで
強化学習 DQNからPPOまで
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"論文紹介 "DARTS: Differentiable Architecture Search"
論文紹介 "DARTS: Differentiable Architecture Search"
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
畳み込みニューラルネットワークの高精度化と高速化
畳み込みニューラルネットワークの高精度化と高速化畳み込みニューラルネットワークの高精度化と高速化
畳み込みニューラルネットワークの高精度化と高速化
 
ゼロから始める転移学習
ゼロから始める転移学習ゼロから始める転移学習
ゼロから始める転移学習
 
実践イカパケット解析α
実践イカパケット解析α実践イカパケット解析α
実践イカパケット解析α
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
研究効率化Tips Ver.2
研究効率化Tips Ver.2研究効率化Tips Ver.2
研究効率化Tips Ver.2
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
 

Similaire à Define and expansion of cpp macro

第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編道化師 堂華
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装Ryosuke Okuta
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話Kinuko Yasuda
 
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Masahiro Sakai
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)Shoji Haraguchi
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会Kiyoshi Ogawa
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 

Similaire à Define and expansion of cpp macro (20)

第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
 
C++ template-primer
C++ template-primerC++ template-primer
C++ template-primer
 
C++の復習
C++の復習C++の復習
C++の復習
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
 
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
Bjarne dont speaking
Bjarne dont speakingBjarne dont speaking
Bjarne dont speaking
 
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会.NET micro  FrameWork for TOPPERS  (.NET基礎)@基礎勉強会
.NET micro FrameWork for TOPPERS (.NET基礎)@基礎勉強会
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 

Plus de digitalghost

ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作ったdigitalghost
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロdigitalghost
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょうdigitalghost
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
 
Preprocess-time Lambda Expression
Preprocess-time Lambda ExpressionPreprocess-time Lambda Expression
Preprocess-time Lambda Expressiondigitalghost
 

Plus de digitalghost (8)

ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
No skk, no life.
No skk, no life.No skk, no life.
No skk, no life.
 
Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょう
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
 
Preprocess-time Lambda Expression
Preprocess-time Lambda ExpressionPreprocess-time Lambda Expression
Preprocess-time Lambda Expression
 

Define and expansion of cpp macro