雖然看着sqrt功能tgmath.h
,
我看到有一個C99的類型通用宏。C99如何在沒有_Generic(C11)的情況下鍵入泛型宏?
我知道我將如何與Generic selection實現它,
但_Generic
並不存在,直到C11。
我們在C89和C99中有遺留項目。
如果可能,我想以類似的方式實現類型泛型功能。
如何在沒有通用選擇的情況下在C中寫入類型泛型宏?
雖然看着sqrt功能tgmath.h
,
我看到有一個C99的類型通用宏。C99如何在沒有_Generic(C11)的情況下鍵入泛型宏?
我知道我將如何與Generic selection實現它,
但_Generic
並不存在,直到C11。
我們在C89和C99中有遺留項目。
如果可能,我想以類似的方式實現類型泛型功能。
如何在沒有通用選擇的情況下在C中寫入類型泛型宏?
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
,double
和long 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
功能的編譯器編譯遺留代碼?
編譯器及其.h文件可能使用C規範中不可用的選項。 IOWs,它不需要遵守規則,我們可以。 – chux