いきちがいのぷろぐらむあ
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
*** チェック用のマクロ 以下のようなマクロを用意してみようと考える. DBG_ASSERT(x) x が成立するか. DBG_ASSERT_PTR(p) アドレスpがRAMとしておかしくないか(NULLはNG) DBG_ASSERT_PTR0(p) アドレスpがRAMとしておかしくないか(NULLはOK) DBG_LIMIT(a, mi, ma) aが[mi,ma]の範囲に収まるか(調度mi,maも含む) DBG_EQ(a,b) aとbが等しいか DBG_LIM_I(a,mi,ma) DBG_LIMITのint専用版 DBG_EQ_I(a,b) DBG_EQのint専用版 (同様にlong long,float,double等も) 多少凝ったチェック等も用意してたこともあるが、 (たとえばポインタチェックでアライメントも指定する等)、 使っていて面倒だと、使わなくなったりおざなりな指定になったりするため 結局、そこそこ単純なのだけでいい、というのが結論。 実装例としては(面倒なんで3つだけ) #define ERR_ASSERT(x) do { \ if (!(x)) { \ ERR_PRINTF(("%s (%s): %s, failed.\n", __FILE__, __LINE__, #x)); \ ERR_ABORT(); \ } \ } while (0) #define ERR_ASSERT_PTR(p) do { \ if (!(ERR_IS_RAM_PTR(p) && err_check_ptr_align(p))) { \ ERR_PRINTF(("%s (%s): bad pointer(%s=%#p).\n" \ , __FILE__, __LINE__, #p, p)); \ ERR_ABORT(); \ } \ } while (0) #define ERR_LIMIT(a,mi,ma) do { \ if (!((mi)<=(a)&&(a)<=(ma))) { \ ERR_STREAM(__FILE__ << " (" << __LINE__ << "): " \ << #a << "=" << (a) << ", out of range[" \ << (mi) << ',' << (ma) << "]\n"); \ ERR_ABORT(); \ } \ } while (0) #ifdef NDEBUG #define DBG_ASSERT(x) #define DBG_ASSERT_PTR(p) #define DBG_LIMIT(a,mi,ma) #else #define DBG_ASSERT(x) ERR_ASSERT(x) #define DBG_ASSERT_PTR(p) ERR_ASSERT_PTR(p) #define DBG_LIMIT(a,mi,ma) ERR_LIMIT(a,mi,ma) #endif 上記は、ERR_ABORT() がvoid関数であることを前提にしているが inline int ERR_ABORT2() { ERR_ABORT(); return 1; } のようにintを返すように定義でもしておけば、 #define ERR_ASSERT(x) (!(x) && (ERR_PRINTF(("%s (%s): %s, failed.\n" \ , __FILE__, __LINE__, #x)), ERR_ABORT2() ) ) のようにもかける. 生成サイズ的にはさして違いはないだろうけど、記述量的にはシンプルになる. が、if 文の形のほうがまだわかりやすい、と感じる人も多そうな気はする. ※ void exit(int); の場合 #define ERR_ABORT2() (((int (*)(int))exit)( 1 ), 1) のように無理やりキャストするのも手……だが実際の定義では _&color(#0){_cdecl}; やら &color(#0){_};_declspec _&color(#0){_attribute_};_ の指定もからんでコンパイラごとの違いが面倒かもでinline関数するのが楽かも、と。
凍結する
凍結しない
タイムスタンプを更新
テキスト整形のルールを表示する
[
凍結
|
差分
|
添付
|
リロード
] [
新規
|
ヘルプ
]
Last-modified: 2013-06-16(日)