Re: [問題] 一個 typedef 語法

看板C_and_CPP作者時間12年前 (2013/12/11 23:30), 編輯推噓7(707)
留言14則, 7人參與, 最新討論串3/4 (看更多)
※ 引述《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

12/11 23:31, , 1F
啊!對厚!我整個忘記 C++ 裡面 static 初值,謝謝解惑 :D
12/11 23:31, 1F

12/11 23:38, , 2F
我還特地轉語法樹出來看到底為什麼 typedef太混淆了XD
12/11 23:38, 2F

12/11 23:39, , 3F
我以為被蓋掉的是P,覺得整個莫名其妙
12/11 23:39, 3F

12/11 23:42, , 4F
主要是 static 之後還沒有型態 所以 P 就當成型態了
12/11 23:42, 4F

12/11 23:42, , 5F
跟 typedef 倒沒什麼關係 XD
12/11 23:42, 5F

12/11 23:47, , 6F
不過我不懂 static P(Q); static P Q; 是一樣的宣告
12/11 23:47, 6F

12/11 23:48, , 7F
static int (foo);
12/11 23:48, 7F

12/11 23:51, , 8F
我沒查 grammar,不過我想就像 int (main)(){} 一樣
12/11 23:51, 8F

12/12 00:39, , 9F
語法就是這樣阿 0.0
12/12 00:39, 9F

12/12 18:46, , 10F
int(i); 這種語法還真難倒我
12/12 18:46, 10F

12/12 18:48, , 11F
那這樣也是正確的嗎? int(i)=5; compile 會過 i=5
12/12 18:48, 11F

12/12 19:59, , 12F
是正確的 n3485 section 8.3 rule 6
12/12 19:59, 12F

12/12 20:03, , 13F
事實上函式指標的宣告 int (*f)()也是這個rule 透過()將
12/12 20:03, 13F

12/12 20:03, , 14F
specifier跟declarator分開
12/12 20:03, 14F
文章代碼(AID): #1Ig8KRSV (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Ig8KRSV (C_and_CPP)