簡體   English   中英

C 中的 Hygenic 宏

[英]Hygenic macros in C

C FAQ聲明C中的通用 SWAP 宏基本上是不可能的,也不值得付出努力。 這對我來說聽起來像是一個挑戰。

它列舉了兩個主要困難:

  1. 尋找合適的類型用作臨時變量。 有一些涉及 char[] 數組和 memcopy 的技巧,但是這種解決方案在SWAP(my_int, my_float)類的東西上失敗了。 許多編譯器都支持decltype風格的操作符,這使得這很容易,但它們是非標准的。 現在我承認失敗,只要求用戶提供合適的類型作為第三個參數。
  2. 為臨時變量尋找安全名稱。 這是我認為我有解決方案的事情。 我可以使用 stringify 運算符#將輸入參數字符串化,並將它們與預期的臨時變量名稱進行比較,以找到不匹配的名稱。
#include <stdio.h>

#define SWAP(a,b,type)                          \
do {                                            \
    if ((#a[0] != 'a') && (#b[0] != 'a')){      \
        type a_temp = a;                        \
        a = b;                                  \
        b = a_temp;                             \
    }else                                       \
    if ((#a[0] != 'b') && (#b[0] != 'b')){      \
        type b_temp = a;                        \
        a = b;                                  \
        b = b_temp;                             \
    }else                                       \
    if ((#a[0] != 'c') && (#b[0] != 'c')){      \
        type c_temp = a;                        \
        a = b;                                  \
        b = c_temp;                             \
    }                                           \
} while(0)

int main()
{
    int a_temp = 10, b_temp = 20, c_temp = 30;

    printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
    SWAP(a_temp, b_temp, int);
    printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
    SWAP(a_temp, c_temp, int);
    printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);
    SWAP(b_temp, c_temp, int);
    printf("a_temp = %d, b_temp = %d, c_temp = %d\n", a_temp, b_temp, c_temp);

    return 0;
}

我已經在許多討論中看到了意外捕獲的問題,但沒有看到任何人提到您可以這樣做,無論是推薦還是譴責它。 這是一個好主意嗎?

如果變量是左值表達式,這將在某些情況下失敗,例如,如果您有int *a_tempint *b_temp ,並且您使用SWAP(*a_temp, *b_temp, int) 並且由於宏默默地使用諸如a_temp類的“常見”名稱,因此如果存在諸如#define a_temp *a類的a_temp ,它可能會中斷。

無論如何,它可以說不是通用的,因為您必須傳遞類型: SWAP(a, b, int)SWAPINT(a, b)沒有根本區別。 如果我們接受傳遞類型,我們是否也接受傳遞臨時變量的名稱? 或者甚至是像_tmpswap0123456789這樣的固定臨時變量名——畢竟,我們接受現在定義為這個宏的更常見的名稱SWAP ,因此擔心它內部的臨時變量的名稱似乎是次要的。

暫無
暫無

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

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