2016-05-22 58 views
3

我想編寫一個C宏,它可以是一個整型文字或類似於整型文字的東西,也可以是另一個宏的名稱,並且將其它宏擴展爲整數文字的值,索引爲一個論點,例如用於將任意宏擴展一定次數的宏?

MAGIC(4, FUN) 

膨脹以

FUN(0) FUN(1) FUN(2) FUN(3) 

相反,如果我會MORE_MAGIC它接受一個範圍的開始和長度,即會更好:

例如

MORE_MAGIC(1, 3, FUN) 

擴展到

FUN(1) FUN(2) FUN(3) 

注:

  • 我可以擴展的數量住不限於,我不知道,99,或50,或類似的東西。
  • 您無法對FUN進行假設。需要是通用的。不,這不適用於手動展開循環。
  • C-only解決方案是最受歡迎的以及需要C++的解決方案(例如,如果您以某種方式在解決方案中使用模板)。
  • 解決方案的行數(包括#包括但不包括註釋)的總數應該最好適中。說,不超過200.
+0

爲什麼要這樣?如何擴展到for循環? – Schwern

+0

「你無法做出有關FUN的假設」和「使用模板」基本上是不兼容的。通過允許使用模板,您可以讓人們對FUN進行假設。這聽起來像你不想說爲什麼你想要這個,因爲你認爲你最瞭解,但你的問題中的筆記已經讓我懷疑。 – hvd

+0

此外,編輯一個問題以取消現有答案的準確性,這些答案明確提供了您所要求的內容,但這些問題還沒有完成,您應該已經知道了。 – hvd

回答

9

升壓預處理器是一個廣泛的庫,專注於這種預處理器的魔力。

它提供了一個名爲BOOST_PP_REPEAT_FROM_TO的宏,它完全符合你的要求。

完全參考,請訪問:
http://boost.org/libs/preprocessor

+0

是否有可能只提取'BOOST_PP_REPEAT_FROM_TO'沒有所有的Boost預處理器庫? – einpoklum

+0

@einpoklum我的理解是,Boost預處理器庫是獨立的,不需要Boost的其餘部分。不過,我不確定您是否可以從Boost預處理器中提取單個組件。 – templatetypedef

+0

通過「Modular Boost」項目的努力,PP的獨立版本可在[here](https://github.com/boostorg/preprocessor)上找到。要提取「REPEAT_FROM_TO」是相當困難的,但是您可以只包含所需的位,其中 zah

-2

你想要什麼基本上是一個展開的循環......但你沒有說爲什麼你想要的。你可以創建一個宏來創建一個for循環,並相信編譯器決定是否值得展開。

#include <stdio.h> 

#define PRINT_INT(i) printf("%d\n", i); 
#define MORE_MAGIC(start, end, function) for(int i = start; i <= end; i++) { function(i); } 
#define MAGIC(end, function) MORE_MAGIC(0, end, function) 

int main() { 
    puts("MAGIC!"); 
    MAGIC(3, PRINT_INT); 

    puts("MORE_MAGIC!"); 
    MORE_MAGIC(2, 6, PRINT_INT); 

    return 0; 
} 
+0

這不回答我的問題。另請參閱編輯。此外,你正在發佈一個數十億印刷版說明! – einpoklum

+0

@einpoklum如果你告訴我們爲什麼你需要這個,以及for循環不會做什麼的一些情況,我們可以更好地回答它。我唯一能想到的就是聲明變量,如果你想聲明如此多的編號變量以至於你需要一個宏,你應該重新思考爲什麼你需要這麼多變量。 – Schwern

+0

@einpoklum不確定你的意思是「*你發佈了一個zillion printf指令*」;它打印11行,它們僅用於演示目的。你的編輯似乎並沒有改變這個問題。如果你不想說這是什麼,你的電話,對我來說沒有多大意義。 – Schwern