作者HuangTzHuan ()
看板C_and_CPP
標題Re: [問題] 一個 typedef 語法
時間Wed Dec 11 23:30:33 2013
※ 引述《EdisonX (卡卡獸)》之銘言:
: ※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: : typedef int P();
: : typedef int Q();
: 路過。
: 我先講一下這種 typedef 吧,順便澄清我上篇推文之錯誤,請忽視。
: 這種 typedef 我只見過一、二次,同時私心討厭這種寫法。
: 一般而言,在定義 function pointer 時,比較常這麼寫
: typedef int (*FPTR_CALLBACK)() ;
: 當有個 function 是 int func() { return 0; }
: 可以這麼用
: FPTR_CALLBACK lpfn = func;
: cout << lpfn() << endl ; // 使用 function pointer 間接呼叫
: 然後有種冷僻的寫法,純粹是為了宣告 prototype 使用的,
: typedef int PROTOTYPE();
: PROTOTYPE myfunc ; // 這行等於是宣告 int myfunc();
: 但卻不能直接使用在定義上
: PROTOTYPE myfunc { return 0;} // 會噴 error
: 目前小弟所知還是必須要乖乖寫完整
: int myfunc() { return 0;}
: 差別是在於 function pointer 時的宣告
: PROTOTYPE * lpfn = myfunc;
: cout << lpfn() << endl;
: 這是目前我所看過的,也可能我看的 Code 還不夠多,
: 所以很討厭用這種方式去做 function pointer , function declare.
: : class X
: : {
: : static P(Q); // equivalent static int Q()
: : };
: : 實在不懂 P(Q) 在括號裡可以放個 Q 嗎?
: : 不過 compile 是會過的。
: 上面這個我就無能為力了。
: 以下請繼續討論。
static P(Q); 等於 static P Q;
所以就如上面說的,宣告一個名稱為 Q 的 function,prototype 是 P
所以上面那行 typedef int Q(); 是混淆視聽用的
兩個 Q 在不同的 symbol table 裡
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.49
推 EdisonX:啊!對厚!我整個忘記 C++ 裡面 static 初值,謝謝解惑 :D 12/11 23:31
推 azureblaze:我還特地轉語法樹出來看到底為什麼 typedef太混淆了XD 12/11 23:38
→ azureblaze:我以為被蓋掉的是P,覺得整個莫名其妙 12/11 23:39
推 LPH66:主要是 static 之後還沒有型態 所以 P 就當成型態了 12/11 23:42
→ LPH66:跟 typedef 倒沒什麼關係 XD 12/11 23:42
推 descent:不過我不懂 static P(Q); static P Q; 是一樣的宣告 12/11 23:47
→ azureblaze:static int (foo); 12/11 23:48
→ HuangTzHuan:我沒查 grammar,不過我想就像 int (main)(){} 一樣 12/11 23:51
→ loveme00835:語法就是這樣阿 0.0 12/12 00:39
推 descent:int(i); 這種語法還真難倒我 12/12 18:46
推 descent:那這樣也是正確的嗎? int(i)=5; compile 會過 i=5 12/12 18:48
推 jackace:是正確的 n3485 section 8.3 rule 6 12/12 19:59
→ jackace:事實上函式指標的宣告 int (*f)()也是這個rule 透過()將 12/12 20:03
→ jackace:specifier跟declarator分開 12/12 20:03