__cdecl
__stdcall
別名 WINAPI
下記のようにswitchブロックの内部で変数宣言をおこなうとコンパイルエラーとなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> int main(void) { int i; for (i = 0 ; i < 100 ; i++) { switch (i%2) { case 0: char msg_even[] = "EVEN"; printf("%3d is %s\n", i, msg_even); break; case 1: char msg_odd[] = "ODD"; printf("%3d is %s\n", i, msg_odd); break; default: printf("%3d is UNKNOWN\n", i); break; } } return 0; } |
下記のようにコンパイラの最適化で省略される個所にブレイクポイントを設定できないことがあります。
1 2 3 4 5 6 7 8 |
while (num_of_line > 0) { /* 中略 */ if (num_of_lines < 10) { continue; /* ここにブレイクポイントを設定できない */ } } |
自己参照する要素を持つ構造体を定義するとコンパイルエラーとなる
1 2 3 4 |
typedef struct st_node { int id; NODE *node; } NODE; |
1 2 |
sample.c:6:3: error: unknown type name ‘NODE’ NODE *node;<code> |
危険なキャストをおこなってバグを誘発した例をみつけたのでご紹介します。
不具合の経緯としては
log10() を呼び出すプログラムをコンパイルすると以下のようなエラーが発生する。
1 2 3 4 5 |
$ gcc main.c /tmp/ccuhFgLT.o: In function `main': main.c:(.text+0x4d): undefined reference to `log10' main.c:(.text+0x75): undefined reference to `log10' collect2: error: ld returned 1 exit status |
C/C++混在環境において 「no definition for “xxx”」などの関数定義が存在しないエラーが発生してリンクに失敗する。
『 マングル (mangle) 』, 『 名前マングリング (name mangling) 』
続きを読む
Microsoft公式コマンドラインツール ILMerge
https://www.microsoft.com/en-us/download/details.aspx?id=17630 続きを読む
C言語の整数型 int は処理系依存です。
C/C++のISO規格(C99とC++11)、および、ITRON仕様では下記のように固定幅整数型を定義しています。
続きを読む
trigraph 三文字表記
文字コード(キーボードから直接入力できる文字種)に自然言語(英語圏以外)の制限(混乱)があった時代の名残。
1 |
??=include <stdio.h> |
1 |
#include <stdio.h> |