如何使用 C 中的预处理器指令配置类型?
How to make types configurable with preprocessor directives in C?
截至目前,我的库的头文件中有类似以下代码的内容(为清楚起见更改了名称):
#ifndef CFG_RESULT_TYPE
#define CFG_RESULT_TYPE double
#endif
#if CFG_RESULT_TYPE == float
#define result_parser strtof
#elif CFG_RESULT_TYPE == double
#define result_parser strtod
#elif CFG_RESULT_TYPE == long double
#define result_parser strtold
#else
#error "Invalid result type"
#endif
typedef RESULT_TYPE result_t
我认为这会起作用,它似乎适用于 float
和 double
(话又说回来,这可能实际上是未定义的行为),但不适用于 long double
。实现这个的正确方法是什么?
我还应该补充一点,_Generic
是不可能的;我坚持这个项目的 C99 标准。
#define DOUBLE 1
#define FLOAT 2
#define LONG_DOUBLE 3
#ifndef CFG_RESULT_TYPE
#define CFG_RESULT_TYPE DOUBLE
#endif
#if CFG_RESULT_TYPE == FLOAT
#define result_parser strtof
#define RESULT_TYPE float
#elif CFG_RESULT_TYPE == DOUBLE
#define result_parser strtod
#define RESULT_TYPE double
#elif CFG_RESULT_TYPE == LONG_DOUBLE
#define result_parser strtold
#define RESULT_TYPE long double
#else
#error "Invalid result type"
#endif
#ifdef RESULT_TYPE
typedef RESULT_TYPE result_t;
#endif
截至目前,我的库的头文件中有类似以下代码的内容(为清楚起见更改了名称):
#ifndef CFG_RESULT_TYPE
#define CFG_RESULT_TYPE double
#endif
#if CFG_RESULT_TYPE == float
#define result_parser strtof
#elif CFG_RESULT_TYPE == double
#define result_parser strtod
#elif CFG_RESULT_TYPE == long double
#define result_parser strtold
#else
#error "Invalid result type"
#endif
typedef RESULT_TYPE result_t
我认为这会起作用,它似乎适用于 float
和 double
(话又说回来,这可能实际上是未定义的行为),但不适用于 long double
。实现这个的正确方法是什么?
我还应该补充一点,_Generic
是不可能的;我坚持这个项目的 C99 标准。
#define DOUBLE 1
#define FLOAT 2
#define LONG_DOUBLE 3
#ifndef CFG_RESULT_TYPE
#define CFG_RESULT_TYPE DOUBLE
#endif
#if CFG_RESULT_TYPE == FLOAT
#define result_parser strtof
#define RESULT_TYPE float
#elif CFG_RESULT_TYPE == DOUBLE
#define result_parser strtod
#define RESULT_TYPE double
#elif CFG_RESULT_TYPE == LONG_DOUBLE
#define result_parser strtold
#define RESULT_TYPE long double
#else
#error "Invalid result type"
#endif
#ifdef RESULT_TYPE
typedef RESULT_TYPE result_t;
#endif