Writing Bug Free C Code Chapter 2 Know Your Environment

2557 ワード

title: Writing_Bug_Free_C_Code_Chapter_2_Know_Your_Environment date: 2017-06-19 19:06:24 tags:
これはもう翻訳ではありません.これがノートです.
chapter 2:あなたの職場環境を知る
//blahblahblah(具体的には、あなたの作業環境の機能、特性を理解することです)あなたの作業範囲内でできるだけ専門家になるようにします.次に、すべての作業環境で発生する問題について議論します.
2.1 C言語
どんなコンパイラを使ってもC言語の作業環境を徹底的に理解しなければなりません
2.1.1配列オペレータ[]
//blahblahblahblah具体的な内容は配列オペレータの機能で、ポインタとの関係は、悪習だと思いますが、身につけるのは難しくないので、勝手にC言語の本を1冊めくってもあります//K&R§A 7.3.1
2.1.2構造体ポインタオペレータ->
//K&R §A7.3.3
2.1.3コンパイル警告レベルを上げる
//具体的にはvsコンパイラを指し、gccに関しては-Wallは多くない
2.1.4コンパイル時に設計を断言するComplierAssert()
           bug        

2.1.5変数宣言
cdecl
2.1.6 typedef
2.1.7ネーミングスペース
2.1.8コードセグメント変数
//コンパイラの実装と関係があり、意味がありません.アクセス権の違いにすぎません
2.1.9隣接文字列
2.1.10マルチパラメータ...
2.1.11関数呼び出し規則
2.1.12コード生成アセンブリ
//以上の2つはプリコンパイラ関係でほとんど役に立たない
2.1.13サスペンションelse問題
2.1.14 strncpy空間踏み込み
2.1.15 switchでdefault書き込みペア
あなたのスペルを間違えたコンパイラはlabal//警告があるはずです.21世紀になった友达、これは間違っているはずです//これは何の経験もありません.
2.1.16論理演算と短絡原則
2.1.17モーガンの法則
//電気のブール回路の章の内容を数えて、基本的な仕事をしました.以上、C言語の復習をしました
2.2 cプリプロセッサ
2.2.1マクロおよびマクロで発生する可能性のある問題
作用域及び原子性
2.2.2役割ドメインが書かれたマクロ
do {}while(0)
2.2.3マクロにおける条件文
サスペンションelseという遭遇する可能性のある問題を避けるために直接マッチングすればよい.
#define ODS(s) if (!bDebugging) {} else OutputDebugString(#s)

2.2.4マクロは文のように正常に使用され、セミコロンまたは文ブロックで終わる
#define WinAssert(exp) if (!(exp)) {AssertError;} else

2.2.5循環マクロ
//そう書くのはお勧めしません.これは上古文法です.LOOP()ENDLOOP太二
2.2.6マクロ数
マクロでsizeofをカプセル化して、よく配列の中で見ます
#define NUMSTATICELS(pArray) (sizeof(pArray)/sizeof(*pArray))

2.2.7前処理演算子#
文字列化と接合技術
2.2.8文字照合
コンパイラ実装に関連しています.これはもう21世紀だ,この部分はもう取り除くことができる.
2.2.9プリプロセッサ命令操作プリプロセッサ命令
マクロスイッチ
以上もC言語の回顧は主にいくつかの奇技が淫巧である.
2.3プログラミングの難題
主にいくつかの実現上の穴です
2.3.1 2の平方形マクロ
#define ISPOWER2(x) (!((x)&((x)-1)))

ビット演算Hacker's delightを参照
2.3.2整数演算が速い
これは浮動小数点数の設計と関係があり,MIT公開授業のプログラミングパターンC言語部分を参照できる.
2.3.3 2つの数を交換して3番目の変数を使わない
有名な穴が変わったり、変わったりします.意味がない.オーバーフローします(もちろん3つの変数でオーバーフローする可能性もあります)
2.3.4異種または相殺鋸歯?この部分は読めなかった
http://www.duckware.com/bugfreec/chapter2.html#windows
2.3.5~0移植性は0 xffffより強い
2.3.6 y=-x問題補完
2.3.71と2の補完コード
Two's complement negation as a macro
#define NEGATE(x) (((x)^~0)+1)

2.4まとめ
个人は総括して多パラメータの问题に注意して、もうすぐマクロのいくつかのtrickがまだ2.3.4理解していないことを忘れます