簡體   English   中英

在C預處理程序宏中,Haskell的`let` /`in`是否等效?

[英]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; })

({})塊中的最后一個語句必須是一個表達式語句,它將用作語句表達式的值。

就是說,如果ab證明沒有副作用,那么即使沒有此操作,GCC也會非常擅長優化重復計算。

不能簡單地...

#define INDEX_OF(prime,mod) (prime / 3 - (mod == 0 || mod == 3 || mod == 4));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM