[英]Is there an equivalent of Haskell's `let`/`in` in C Preprocessor Macros?
我具有以下功能(用於主要功能,以防您好奇)
unsigned long long primeAt(unsigned long long index) {
return index * 3 + (index % 2 ? 2 : 1);
}
我已經重構到宏中
#define PRIME_AT(index) (index * 3 + (index % 2 ? 2 : 1))
出於性能和可讀性原因。
我想知道是否有任何方法可以對此功能執行相同操作:
unsigned long long indexOf(unsigned long long prime) {
int mod = prime % 6;
return prime / 3 - (mod == 0 || mod == 3 || mod == 4);
}
不必重新計算prime % 6
3 3如下?
#define INDEX_OF(prime) (prime / 3 - ((prime % 6) == 0 || (prime % 6) == 3 || (prime % 6) == 4));
(如果不是萬億次,此代碼實際上將運行數十億次,因此性能至關重要)
它不是標准的,但是GCC(以及所有其他模仿它的編譯器,即MSVC以外的幾乎所有東西)都支持一種稱為“語句表達式”的東西。 結合可能的typeof
,它可使宏變得非常強大。
#define MAX(a, b) ({ __typeof__((a)) __a = (a); typeof((b)) __b = (b); __a > __b ? __a : __b; })
({})
塊中的最后一個語句必須是一個表達式語句,它將用作語句表達式的值。
就是說,如果a
和b
證明沒有副作用,那么即使沒有此操作,GCC也會非常擅長優化重復計算。
不能簡單地...
#define INDEX_OF(prime,mod) (prime / 3 - (mod == 0 || mod == 3 || mod == 4));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.