編譯器遞迴的中止條件

2021-04-02 11:56:21 字數 655 閱讀 8974

利用編譯器遞迴的模板算階乘的**如下,希望編譯期就求值完畢,也就是說比如這麼寫 int res = factorial< 3 >::result; 就相當於寫int res = 6;

template< unsigned int num >

struct factorial;};

上面的**看起來不錯,但是無法通過編譯(vc.net 2003),會報乙個c1202: 遞迴型別或函式依賴項上下文太複雜。

想要編過就得再帶乙個特化版的factorial:

template<>

struct factorial< 0 >;};

這樣寫的話原來的定義就可以簡化為 result = num * factorial< num - 1 >::result了

仔細看原來的**,遞迴明明是可以中止的啊?但是仔細一想,不能要求編譯器那麼聰明,它不可能編譯到

num == 0的時候一看哈哈發現能中止(如果不能中止就停不下來了),應該是直接一看是遞迴,然後再一看沒有特化版,就直接報錯了(我猜的)。

試了一下,具現 factorial< num >的地方不管num給多大,編譯器都是立即報出錯誤,可見一定是在真正開始遞迴之前就已經下結論了

這樣的缺點是只要用到模板遞迴,就一定要帶乙個特化版,心裡總有些不爽。當然有些人會覺得這樣看起來比較清楚,各有所好吧

編譯器預處理 ifndef 條件編譯

這是 if not defined的簡寫,是巨集定義的一種,它是可以根據是否已經定義了乙個變數來進行分支選擇,一般用於除錯等等。實際上確切的說這應該是預處理功能中三種 巨集定義,檔案包含和條件編譯 中的一種 條件編譯。define x 定義乙個巨集 endif c語言在對程式進行編譯時,會先根據預處...

尾遞迴與編譯器優化

在計算機中,程式執行中的函式呼叫是借助棧實現的 每當進入乙個新的函式呼叫,棧就會增加一層棧幀,每當函式返回,棧就會減少一層棧幀。這個棧的大小是有限的 貌似是1m或者2m 所以在執行遞迴的過程中遞迴的次數是有限度的,超過某個不是很大的值就會爆棧 棧溢位 以求解fabonacci問題為例 使用遞迴的方式...

VC編譯器與GCC編譯器的區別

今天無意寫了一段 發現了vc編譯器與gun的gcc編譯器還是存在區別的。畢竟gcc支援的是標準c。include struct node int main 上述 在gcc下是編譯失敗的,提示的錯誤 uknown typename node 但是放到vc編譯器下則順利編譯通過。於是按照標準c寫了另外乙...