いきちがいのぷろぐらむあ
PG雑記/assert系マクロ関係のメモ
の編集・凍結
(
https://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
*** assert の実装 assertマクロは、例えば、以下のような感じに定義できる. #ifdef NDEBUG // NDEBUG定義時(RELESEコンパイル時)は何もしない. #define assert(x) #else // NDEBUG未定儀時(DEBUGコンパイル時)は条件をチェック. #define assert(x) do { \ if (!(x)) { \ printf("Assertion failed: %s, file %s, line %d\n" \ , #x, __FILE__, __LINE__); \ exit(1); /*abort();*/ \ } \ } while (0) #endif プリプロセッサ・マクロの記述に慣れてないと?な代物かもしれない. このマクロ定義では、マクロ記述での基本的な事が結構含まれていて - #define マクロ定義は1行で記述しなければならず、複数行に別けたい場合は行連結指定の\ を使う必要がある - if条件式で !x でなく !(x) のように記述するのは、例えば a+1 が指定されると !a+1 のように式の意味が変わってしまって不味いので、それを回避するため。~ のでマクロ引数で''数値(式)''を受け取る場合は、''マクロ中では必ず()をつける''必要がある。 - #x は、マクロ引数の条件式を、出力するために文字列化する. - _&color(#0){_FILE_};_, _&color(#0){_LINE_};_ はコンパイル時に使われたそのファイル名(文字列)と行番号(整数)に置き換わる特殊なマクロ名. - {…} でなく、do { … } while (0) で全体を囲っているのは、~ if (…) assert(…); else …;~ のように使われた場合に {} のみだと~ if(…) {…}; else …;~ になって '';'' else がエラーになるのを回避するため.~ マクロ定義で複文を扱うときの常套句. //(コーディング規約で絶対にif,while等で{}を付ける、と決めていたとしても、ツールでチェックしているので無い限り、do {} while(0)にすべき) のようになっている。~ (あと、ここで出ていないマクロ機能関係としては##や _&color(#0){_func_};_ があるが、それらは後述) ※ 隣接文字列定数の連結機能を用いて&br(); "Assertion failed: " #x ", file " _&color(#0){_FILE__}; ", line %d\n"&br();のように書くこともできる.&br(); が、これだと実行時の引数は減るが、assert 毎にデバッグ文字列が作られstaticな文字列が膨れ上がりやすいので、止めておいたほうがいいだろう. ~ なお上記は、動作の雰囲気をみるため、あえて標準ライブラリのみでマクロ内だけで処理を終えているが、実際には #define assert(x) (!(x) && _assert_message(#x,__FILE__,__LINE__)) のような感じに、出力&プログラムストップ処理をまとめたサブルーチンを用意しているかもしれない。(このほうが、デバッグ処理として生成されるコード量が減るだろう) ~
凍結する
凍結しない
タイムスタンプを更新
テキスト整形のルールを表示する
[
凍結
|
差分
|
添付
|
リロード
] [
新規
|
ヘルプ
]
Last-modified: 2013-06-16(日)