我想制作長度(int)log(macro constant)
像的陣列
#define MACRO_NUM 100
int arr[(int)log(MACRO_NUM)];
但如您所知,MSVC 不支持變長陣列。所以,宣告陣列,我不能在陣列的索引處使用變數或函式。這意味著在運行時確定的每個值都不能成為陣列的索引。所以我認為如果可能的話,前處理器應該在編譯之前進行某種計算。
所以我的問題是
- 我的推斷對嗎?
- 那么有沒有辦法讓前處理器計算呢?或者前處理器只能做替換。
我知道還有另一種方法,例如使用指標進行動態分配等,但是,作為一名學生,我只是徘徊,當不支持可變長度陣列時,可以使用陣列和宏常量來做到這一點。
uj5u.com熱心網友回復:
如果MACRO_NUM保證是編譯時常量(例如 100)并且(int)log(MACRO_NUM)您的意思是“最大的k使得 2 k ≤ MACRO_NUM”,那么它可以完成(但不能通過讓前處理器進行計算,即不可能):
#define LOG_MACRO_NUM ((MACRO_NUM >= (1UL<<1)) \
(MACRO_NUM >= (1UL<<2)) \
(MACRO_NUM >= (1UL<<3)) \
(MACRO_NUM >= (1UL<<4)) \
(MACRO_NUM >= (1UL<<5)) \
(MACRO_NUM >= (1UL<<6)) \
(MACRO_NUM >= (1UL<<7)) \
(MACRO_NUM >= (1UL<<8)) \
(MACRO_NUM >= (1UL<<9)) \
(MACRO_NUM >= (1UL<<10)) \
(MACRO_NUM >= (1UL<<11)) \
(MACRO_NUM >= (1UL<<12)) \
(MACRO_NUM >= (1UL<<13)) \
(MACRO_NUM >= (1UL<<14)) \
(MACRO_NUM >= (1UL<<15)) \
(MACRO_NUM >= (1UL<<16)) \
(MACRO_NUM >= (1UL<<17)) \
(MACRO_NUM >= (1UL<<18)) \
(MACRO_NUM >= (1UL<<19)) \
(MACRO_NUM >= (1UL<<20)) \
(MACRO_NUM >= (1UL<<21)) \
(MACRO_NUM >= (1UL<<22)) \
(MACRO_NUM >= (1UL<<23)) \
(MACRO_NUM >= (1UL<<24)) \
(MACRO_NUM >= (1UL<<25)) \
(MACRO_NUM >= (1UL<<26)) \
(MACRO_NUM >= (1UL<<27)) \
(MACRO_NUM >= (1UL<<28)) \
(MACRO_NUM >= (1UL<<29)) \
(MACRO_NUM >= (1UL<<30)) \
(MACRO_NUM >= (1UL<<31)))
以大腸桿菌為生
如果要處理大于 32 位的數字,請繼續... :-)
當然,該基本模式可以與其他基礎一起使用,但基礎 2 更容易使用。
uj5u.com熱心網友回復:
不,前處理器不進行計算,只進行替換和其他常見的前處理器的東西。
但是,有時您可以獲得類似的效果,如下所示。在 C 中幾乎任何需要編譯時常量的地方,您都可以使用任意算術運算式,其運算元是常量(將由編譯器而不是前處理器計算)。并且宏可以是包裝此類運算式的便捷方式,特別是如果它會長得尷尬。
作為一個簡單的例子,你可以做
#define SQUARE(x) ((x)*(x))
int foo[SQUARE(6)];
在預處理之后,這讀取int foo[((6)*(6))];并且編譯器定義了一個長度為 36 的陣列。計算是由編譯器完成的,而不是前處理器,但效果大致相同。
Nowlog通常不是編譯器可以在編譯時評估的函式,但您可以偽造它:
#define MY_LOG(x) ((x) < 10 ? 0 : (x) < 100 ? 1 : (x) < 1000 ? 2 : .....)
盡可能多地使用?:,直到您用盡intorlong或其他的范圍。對于以十為底的對數,最多只能是 10 或 20。然后你可以做
#define MACRO_NUM 100
int arr[MY_LOG(MACRO_NUM)]
并得到一個長度為 2 的陣列。
請注意不要使用MY_LOG具有副作用的引數!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417727.html
標籤:
下一篇:如何從單個陣列創建多個陣列?
