いきちがいのぷろぐらむあ
PG雑記/assert系マクロ関係のメモ
の編集・凍結
(
https://www.6809.net/tenk/?PG%e9%9b%91%e8%a8%98%2fassert%e7%b3%bb%e3%83%9e%e3%82%af%e3%83%ad%e9%96%a2%e4%bf%82%e3%81%ae%e3%83%a1%e3%83%a2%09%e3%81%ae%e7%b7%a8%e9%9b%86%e3%83%bb%e5%87%8d%e7%b5%90
)
[
トップ
] [
一覧
|
検索
|
最終更新
]
□
[
readme
] [
雑記
] [
PROG
] [
倉庫
]
ページを凍結するにはパスワードが必要です。
B
I
U
D
H
[[]]
<br>
--
管理者パスワード:
-- 雛形とするページ --
#RecentChanges
C言語機能の比較
C言語機能テスト結果1
C言語機能テスト結果2
C言語機能テスト結果3
FrontPage
GNU General Public License
GNU 一般公衆利用許諾書 (GNU General Public License)
HeaderMenu
InterWikiName
InterWikiSandBox
MenuBar
PG雑記
PG雑記/Cコンパイラ・オプション・メモ
PG雑記/SubMenu
PG雑記/Uncrustifyのオプション
PG雑記/assert系マクロ関係のメモ
PG雑記/pyukiwikiメモ
PG雑記/pyukiwikiメモ/2006-02-19
PG雑記/pyukiwikiメモ/2006-02-20
PG雑記/pyukiwikiメモ/2006-02-21
PG雑記/pyukiwikiメモ/2006-02-22
PG雑記/pyukiwikiメモ/2006-02-23
PG雑記/pyukiwikiメモ/2006-02-24
PG雑記/pyukiwikiメモ/2006-02-25
PG雑記/pyukiwikiメモ/2006-02-26
PG雑記/pyukiwikiメモ/2006-03-16
PG雑記/pyukiwikiメモ/2006-03-17
PG雑記/pyukiwikiメモ/2006-03-18
PG雑記/pyukiwikiメモ/2006-03-19
PG雑記/pyukiwikiメモ/2006-03-22
PG雑記/pyukiwikiメモ/SubMenu
SandBox
SubMenu
The "Artistic License"
The Artistic License 日本語訳 1.0
cl_test_src
lcc メモ
readme
ruig
test
サブルーチン
ヘルプ
倉庫
倉庫/C関係
倉庫/SubMenu
倉庫/hidemaru
倉庫/pyukiwiki
倉庫/グラフィック関係
倉庫/一般
倉庫/開発
掲示板
整形ルール
雑記
雑記/2005
雑記/2005-06-12
雑記/2005-06-19
雑記/2006
雑記/2006-02-08
雑記/2006-02-11
雑記/2006-02-12
雑記/2006-02-13
雑記/2006-02-26
雑記/2006-03-12
雑記/2006-03-13
雑記/2006-03-20
雑記/2006-03-21
雑記/2006-03-30
雑記/2006-11-05
雑記/2006-11-06
雑記/2006-11-11
雑記/2007
雑記/2007-04-28
雑記/2007-08-26
雑記/2008
雑記/2008-01-01
雑記/2008-05-24
雑記/2008-10-01
雑記/2008-10-02
雑記/2008-10-03
雑記/2008-10-04
雑記/2008-10-05
雑記/2008-10-11
雑記/2008-11-03
雑記/2008-11-04
雑記/2009
雑記/2009-11-02
雑記/2009-11-20
雑記/2009-11-23
雑記/2009-11-26
雑記/2009-12-02
雑記/2009-12-04
雑記/2009-12-09
雑記/2009-12-10
雑記/2009-12-12
雑記/2009-12-15
雑記/2009-12-17
雑記/2009-12-18
雑記/2009-12-20
雑記/2009-12-24
雑記/2010
雑記/2010-01-11
雑記/2010-01-26
雑記/2010-02-04
雑記/2010-02-05
雑記/2010-02-13
雑記/2010-03-09
雑記/2010-03-12
雑記/2010-03-13
雑記/2010-03-14
雑記/2010-03-15
雑記/2010-03-20
雑記/2010-03-21
雑記/2011
雑記/2011-01-01
雑記/2011-01-06
雑記/2011-11-11
雑記/2012
雑記/2012-02-29
雑記/2012-06-03
雑記/2012-10-27
雑記/2012-12-12
雑記/2012-12-14
雑記/2013
雑記/2013-05-19
雑記/2013-05-20
雑記/2013-05-21
雑記/2013-05-26
雑記/2013-06-16
雑記/2013-09-22
雑記/2014
雑記/2014-06-20
雑記/2014-10-12
雑記/2014-10-13
雑記/2014-11-02
雑記/2014-12-14
雑記/2014-12-21
雑記/2014-12-28
雑記/2015
雑記/2015-01-01
雑記/2015-02-07
雑記/2015-04-20
雑記/2015-04-29
雑記/2015-07-05
雑記/2015-07-18
雑記/2015-08-13
雑記/2015-08-14
雑記/2015-08-15
雑記/2016
雑記/2016-02-28
雑記/2016-03-27
雑記/2016-08-03
雑記/2016-09-03
雑記/2016-11-19
雑記/2017
雑記/SubMenu
** static_assert c/c++の次の標準規格(c1x, c++0x)では、 static_assert(定数(条件)式, "エラー時のメッセージ") という感じで、コンパイル時に、定数式が真(非0)であるかをチェックし、 偽(0)だったら、エラーメッセージを表示する、という機能が追加される. 例えば (試してないのでたぶん) static_assert(sizeof(int) == 4, "intが4バイトでない"); static_assert はコンパイラ自身への追加機能で実現されるが、 エラーメッセージ出力無しならば、現行の c/c++でも似たような処理を用意できる. →定数式の結果が0のときに、コンパイルエラーになるような文を作ればいい.~ たとえば #define STATIC_ASSERT(x) typedef char static_assert_check[ (x) ? 1 : -1 ] のようにすれば、定数式 xの結果が真ならば static_assert_check という名のchar[1] の型がつくられokだが、偽だとchar[-1]でコンパイルエラーになる.~ typedef を記述できる箇所ならば、関数の内外で記述できる. >※ typedefでなく例えば structでメンバーに配列を持つのでもできるが、typedefのほうが単純で楽だろう.~ ※ コンパイラがどの規格に沿っているか……配列の添え字は、古いものだと0は NG だが gcc拡張やc99以降 0 は OK のため、NG として -1 を選んでいる. ~ ※ Cの場合でも配列添え字[0]がokなら、struct中での記述を可能にできたりする模様([[こちら>http://www.kijineko.co.jp/node/709]]を参照) さて c++ (および c でも同様な拡張をしているコンパイラ) なら typedef は同じ内容なら複数回定義できるが、c の場合は 名前(static_assert_check)が衝突してしまう。 なので名前の衝突回避としてマクロの連結機能## と 行番号 _&color(#0){_LINE_};_ を用いてその都度適当に新しい名前を生成することにする。 ''ダメ''な例を先に出すと #define STATIC_ASSERT(x) typedef char static_assert_##_&color(#0){_LINE_};_[ (x) ? 1 : -1 ] は static_assert__&color(#0){_LINE_};_ というふうに先に連結##が機能して固定の名になってしまい意味なし。 いつマクロ(名) が展開されるかが問題で、連結##より先に _&color(#0){_LINE_};_ が展開されるようにするには''マクロ引数''の展開を利用する。~ 以下のような連結マクロを用意。 #define M_CAT(a,b) M_CAT_2(a,b) #define M_CAT_2(a,b) M_CAT_3(a##b) #define M_CAT_3(x) x 実はこのへんコンパイラごとに微妙に非互換があり、M_CAT_3が不要なコンパイラも多いけれど vc だと必要。 // おそらくISO C99 準拠ならば M_CAT_3 は不要だけれど、(c99非準の) vc では必要。 (また、これではダメなコンパイラもあるようだけど、手持ちにないので未考慮。具体的には boost/preprocessor 等を参照のこと) これを用いて #define STATIC_ASSERT(x) typedef char M_CAT(static_assert_,__LINE__)[ (x) ? 1 : -1 ] のようになる。~ 行番号を用いているため、もちろん、直に同じ行に書くと衝突するし、別ヘッダでたまたま同じ行だったとしても衝突するが、 実使用上はそうそうぶつからないだろうでよしとしとく(ぶつかったら、適当に改行いれて行をづらす、と)。~ vc や gcc では _&color(#0){_COUNTER_};_ という使われる都度 値をカウントアップする特殊なマクロ名があるので、この手のものがあるコンパイラならば _&color(#0){_LINE_};_ のかわりに使うのも手。 C++の場合は (エラーメッセージを多少わかりやすくできたりするので) template を用いた実装のほうがよいかもしれない。 そのへんは BOOST_STATIC_ASSERT とか諸々あるので、それらを使うなり参考にするなり。
凍結する
凍結しない
タイムスタンプを更新
テキスト整形のルールを表示する
[
凍結
|
差分
|
添付
|
リロード
] [
新規
|
ヘルプ
]
Last-modified: 2013-06-16(日)