2007-06-01から1ヶ月間の記事一覧

エラーメッセージジェネレータ

「プログラミング作法」p.322 enum + コメントからエラーメッセージを生成する方法。

どこかで拾った例

.IGNORE: SHELL = /bin/csh CC = gcc RM = rm -f CFLAGS = -c -g CFLAGS_B = -c -g -DBROADCAST -o LDFLAGS = -g -o LDLIBS = -lpthread TARGET = thdrun TARGETB = thdrunb LIBS = lib SRCS = $(TARGET).c $(LIBS).c DEFS = def.h lib.h OBJS = $(TARGET).o…

ターゲットとパターンに固有の変数

ようやく知りたかったことが発見できた。 gui.o: CPPFLAGS += -DUSE_NEW_MALLOC=1 gui.o: gui.h

コマンド行の前に"@"が置かれると、そのコマンド自体は表示されなくなる。

依存関係の自動生成

依存関係を解決するMakefileの例 VPATH = src include CPPFLAGS = -I include SOURCES = count_words.c \ lexer.c \ counter.c count_words: counter.o lexer.o -lfl count_words.o: counter.h counter.o: counter.h lexer.h lexer.o: lexer.h -include $(su…

変数

CFLAGS コンパイルオプション CPPFLAGS プリプロセッサオプション LDFLAGS リンカオプション TARGET_ARCH アーキテクチャオプション

ANCI規格に対して厳密にコンパイルする方法

gcc

gcc の-std, -ansi, -pedantic オプション等を使用する

翻訳単位と外部変数の宣言、定義、及び仮定義

C

調査内容を纏めた。情報源が手元の環境でのテスト結果とインターネットなので、いずれ規格書で確認する必要があると思う。 翻訳単位 プリプロセスが終了した後の、1つのソースファイルを翻訳単位という。コンパイル単位とも言う。複数のソースファイルが同…

少し高度な例

まだ冗長 vpath %.c src vpath %.l src vpath %.h include CPPFLAGS = -I include all: count_words count_words: count_words.o counter.o lexer.o -lfl gcc $(CPPFLAGS) $^ -o $@ count_words.o: count_words.c counter.h gcc $(CPPFLAGS) -c $gcc $(CPPFL…

組み込みルールを使用した例

同じ内容のものが以下のように簡略できる VPATH = src include CPPFLAGS = -I include all: count_words count_words: counter.o lexer.o -lfl count_words.o: counter.h counter.o: counter.h lexer.h lexer.o: lexer.h TAGS: gtags -iv clean: rm -f count…

実行オプション

-f ファイル名 “Makefile”の代わりに別のファイル名を使う。“-”は標準入力。 また、Makefile 内から別の Makefile を取り込んだりする場合には、 サーチパスが設定できる。 マクロ VPATH は依存ファイルをサーチするパスのリストである。 「:」 で区切って書…

基本書式 ターゲット: 必須(依存)項目1 必須項目2 ... 実行コマンド 基本書式の具体例 count_words: count_words.o lexer.o -lfl gcc count_words.o lexer.o -lfl -o count_words count_words.o: count_words.c gcc -c count_words.c lexer.o: lexer.c gcc …

配列の初期化時の注意

gcc 3.4.6では、以下のように配列の初期化中に同じ添字を使用しても、黙ってコンパイルされてしまうので注意すること(コードは便宜上簡略)。 Tornadoだと"Internal compiler error"となった。分かりにくいエラーだなあ。 int array[2] = { [0] = 1, [0] = 2,…

構造体メンバのオフセットとサイズの求めかた

C

オフセットの求めかた (int) (&(((struct *)0)->member)) 1. ゼロを構造体のポインタ型にキャストする 2. 1を使用してメンバの相対的な位置を求める 3. &を使用してそのアドレスを取得する 4. int型へキャストする サイズの求めかた sizeof(((struct *)0)->m…

unsigned型

C

格上げの規則に煩わされることの無いように、unsignd型は不必要に使用しないこと。ビットフィールドやバイナリのマスクに限ること。

sizeof演算子の型

C

sizeof演算子の結果は unsigned になる。signed int型と比較する場合は注意。(そのようなことはしない方が良い)

算術変換

C

ANCI Cでは、算術演算で異なる型を指定すると、型変換が行われる。型変換は、情報が欠落しない限り、以下の方向で行われる。 実数 高精度 符号付

ファイル名の一括変更

for file in `find . -type f ` do mv $file $(echo $file | sed -e 's/\(.*\)old\(.*\)/\1new\2/g') done

変数の初期化

C言語 FAQ より 「静的な」寿命を持つ変数(すなわち、関数の外で宣言した変数や記 憶域クラスをstaticと宣言した変数)は、プログラマーが「=0」と打 ち込んだかのように、0に(プログラムの立ち上がり時に一度だけ)初 期化されることが保証されている。すなわ…

部分的なマクロの展開

リージョンを選択し、M-x c-macro-expand (c-mode で C-c C-e)