雖然原來名稱叫10 C99 tricks,不過有些跟C99沒關係,不過還是有參考價值。
Ternary operator without middle operand (gnu extension)
1 | // Instead of |
個人覺得, 這個樣子更不容易看出程式在寫什麼
Unamed struct for compound type
根據實驗之後,這也不需要C99,C89就能正常運作了
在一般的情形之下,這樣子Compilier會提出警告
1 | struct { |
Clang發出這樣的警告
1 | demo.c:5:1: warning: declaration does not declare anything [-Wmissing-declarations] |
但是如果再union / struct當中這樣使用的話就沒有問題,可以依照自己喜歡的方式使用
1 | typedef union { |
IS_DEFINED macro
無法理解為什麼要設計的這麼複雜..
1 | // As used in the linux kernel. |
Convenience macro for Debuging
其實這個方法不限於OpenGL,像GetLastError
或errno
都可以用類似的方法來確認狀態。
1 | // Not really special, but so useful I thought |
Array size macro
這個也不世新玩意了
1 | // Is there any C project that does not use it? |
Safe-type macro (uses a gnu extension)
當然這也不是只用於min, max, 還可以用於swap等…弱化版的Template。
1 |
|
Passing pointer to unnamed variables to function.
這是一般的寫法
1 | void func(const int *arg); |
不過可以寫成這樣
1 | // We can write. |
更進一步
1 | // Can be useful with a helper macro. |
如果搭配上designated initializers威力更大
1 | typedef struct { |
Named initializer, with default values
designated initializers跟Variadic Macros的組合技
1 | // I use this one all the time when writing |
X macros
即使在C++當中,這也是個非常重要的技巧之一,利用Macro來進行Code Generation。
X Macro分成兩部分,一個是彼此相相關連的List,另外一個是巨集,對這個List進行展開動作,而這點Template無能為力。
例如
1 |
|
當要新增一種顏色的時候,只需要在COLORS那邊修改,減少了維護和犯錯的可能性。
如果需要更進一步的學習,可以參考
- X Macro
- The X Macro
- The New C: X Macros
- Reduce C-language coding errors with X macros Part 1 Part 2 Part 3
- Real-world use of X-Macros
State machine helper using LINE
Generator的簡易實現,將S__LINE__來當做State之一。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34// This is a great trick.
// Instead of:
int iter(int state) {
switch (state) {
case 0:
printf("step 0\n");
return 1;
case 1:
printf("step 1\n");
return 2;
case 2:
printf("step 2\n");
return 3;
case 3:
return -1;
}
}
// We can define:
// And now the function can be written
int iter(int state) {
START
printf("step 0\n");
YIELD
printf("step 1\n");
YIELD
printf("step 2\n");
END
}