看板 C_and_CPP 關於我們 聯絡資訊
小的今天才跟到九九乘法系列文 X Macros好像還沒有被實作 獻醜了 #include <stdio.h> #define V1(i) \ X((i), 1) \ X((i), 2) \ X((i), 3) \ X((i), 4) \ X((i), 5) \ X((i), 6) \ X((i), 7) \ X((i), 8) \ X((i), 9) #define V2 \ Y(1) \ Y(2) \ Y(3) \ Y(4) \ Y(5) \ Y(6) \ Y(7) \ Y(8) \ Y(9) int main() { #define X(i, a) printf("%02d X %02d = %02d\n", i, a, i*a); #define Y(i) V1(i) V2 #undef Y #undef X return 0; } ------------------- 大Guy4醬 ------------------- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.142.124.77 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1558015171.A.4A6.html
timmy999: 我新手只會迴圈 可以稍微解釋一下嗎? 05/16 22:46
CCWck: 唯一的一行code在V2,然後就一直展開 05/16 23:43
CCWck: 和call function有點像9個 05/16 23:44
RishYang: 沒錯,V2是一堆Y(i)的替換,Y(i)又是V1(i)的替換 05/17 00:21
RishYang: V(i)又是一堆X(i, a)的替換,X(i,a)就是最後的prinf 05/17 00:23
CCWck: 不過我不懂為什麼兩個define要在main裡面再undef 05/17 00:36
RishYang: 在此可以不undef,因為這種展開常常會重新定義 05/17 00:45
RishYang: 像是https://reurl.cc/byleX 05/17 00:46
CCWck: 那為何要放在main裡面 05/17 00:59
RishYang: 因為展開過後有81個printf,放在main裡面執行很適合 05/17 01:23
Schottky: 推 05/17 12:58
Killercat: gcc編的話 gcc -E展開看就知道了 05/22 20:05
Killercat: -E(還是-e 忘了)會展開所有#define印出來 05/22 20:05
Killercat: 然後看最後幾行即可 前面都不用看 05/22 20:09
RishYang: 把#include註解,產生的預處理結果就不會太長 05/22 20:40