C

プロプロセッサのマクロ展開と ## 演算子 (2)

前回を書いてからすっかり経ってしまったが、C/C++ プリプロセッサのマクロ展開と ## 演算子の話。 まずは、__TEXT がどう解釈されるのかを見てみる: #define __TEXT(quote) L ## quote C++ 標準*1 にはこうある: 『16.3 Macro replacement』の「9」 A prepr…

プロプロセッサのマクロ展開と ## 演算子 (1)

Windows API には TCHAR 型というものがある((MSDN ライブラリでは TCHAR は unsigned char の typedef だと解説されているが、Visual C++ 2008 Express Edition に付いてきた WinNT.h では char の typedef になっていた。)): #ifdef UNICODE typedef wchar…

ポインタ変数なのか、ポインタ型なのか、

C でポインタを定義するときの書き方には、3つの流派があるようだ: ポインタ「変数」派 int *p; 変数 p はポインタ変数という特別な変数だ、という主張。 (p を逆参照*1した結果である) *p の型は int だよ、という形での型付け。 ポインタ「型」派 int* p; …

#include ガードにファイル名を入れるのは止めませんか?

#include ガードといえば、大体こんな感じのがメジャーかと思う: sample.h の #include ガード #ifndef SAMPLE_H #define SAMPLE_H // 宣言・定義など #endif // ifndef SAMPLE_H 実を言えば、こういう #include ガードがあんまり好きじゃない。 もちろん、#…

longjmp() 関数と例外処理

C 言語の野放図なパワーを見せつけてくれるのが longjmp() 関数だ。とりあえず、サンプルコードを見てみよう: #include <setjmp.h> #include <stdio.h> void f(jmp_buf jmpBuf) { puts("f() called."); longjmp(jmpBuf, 1); } int main() { jmp_buf jmpBuf; setjmp(jmpBuf); put</stdio.h></setjmp.h>…