2016-04-30 68 views
0

雖然看着sqrt功能tgmath.h,
我看到有一個C99的類型通用宏。C99如何在沒有_Generic(C11)的情況下鍵入泛型宏?

我知道我將如何與Generic selection實現它,
_Generic並不存在,直到C11。

我們在C89和C99中有遺留項目。
如果可能,我想以類似的方式實現類型泛型功能。

如何在沒有通用選擇的情況下在C中寫入類型泛型宏?

+0

編譯器及其.h文件可能使用C規範中不可用的選項。 IOWs,它不需要遵守規則,我們可以。 – chux

回答

1

C99如何在沒有_Generic(C11)的情況下鍵入泛型宏?

非便攜式。

還有如果你看一下作爲glibc的一部分提供的tgmath.h頭,例如,它不使用_Generic寫一個類型的通用宏預C11 C.

(因爲沒有通用的方法它需要與不支持_Generic的編譯器一起工作)。相反,它使用了一些gcc特有的功能,如包含在一些非凡的宏中的__builtin_classify_type。靠近文件頂部的評論說:

/* This is ugly but unless gcc gets appropriate builtins we have to do   
    something like this. Don't ask how it works. */ 

一些宏定義的比較sizeof (Val)(其中Val是宏參數)與sizeof (double)。如果float,doublelong double並不都具有不同的大小,則可能會失敗。

而且整個事情是包裹在:

#if __GNUC_PREREQ (2, 7) 
/* a lot of ugly macro definitions */ 
#else 
# error "Unsupported compiler; you cannot use <tgmath.h>" 
#endif 

你也許可以拼湊使用sizeof的東西,但它是醜陋的。

有沒有可能使用支持C11或至少_Generic功能的編譯器編譯遺留代碼?

相關問題