C++ 通过C+中的预处理器定义构建不同的数据类型+;

C++ 通过C+中的预处理器定义构建不同的数据类型+;,c++,c-preprocessor,type-conversion,C++,C Preprocessor,Type Conversion,我想快速、正确地将float的用法改为double,有人建议,这可以通过正确使用预处理器定义来实现。不幸的是,我从未这样做过,但我在这里遇到了以下答案: 因此,我想知道,如果这个方法是我应该如何进行的,特别是考虑到我正在处理的程序的范围有多大,还是我应该使用另一种方法?如果是另一种方法,每个人都会有什么建议?如果不想使用预处理器,则要使用typedef或使用 编辑:类似于: #ifdef USE_DOUBLES typedef double my_float_type; #else ty

我想快速、正确地将float的用法改为double,有人建议,这可以通过正确使用预处理器定义来实现。不幸的是,我从未这样做过,但我在这里遇到了以下答案:


因此,我想知道,如果这个方法是我应该如何进行的,特别是考虑到我正在处理的程序的范围有多大,还是我应该使用另一种方法?如果是另一种方法,每个人都会有什么建议?

如果不想使用预处理器,则要使用
typedef
使用

编辑:类似于:

#ifdef USE_DOUBLES 
typedef double my_float_type; 
#else 
typedef float my_float_type; 
#endif
然后使用
my\u float\u type
作为所讨论的所有浮点变量的类型。然后,您可以从
make
系统或公共头文件等中定义使用双精度
或不使用双精度


您的OP设计从根本上说是有缺陷的,因为
#定义关键字的
s(即
double
float
)会导致未定义的行为,并且您不能重新定义内置类型(即
double
float
),您想使用
typedef
使用

编辑:类似于:

#ifdef USE_DOUBLES 
typedef double my_float_type; 
#else 
typedef float my_float_type; 
#endif
然后使用
my\u float\u type
作为所讨论的所有浮点变量的类型。然后,您可以从
make
系统或公共头文件等中定义使用双精度
或不使用双精度

您的OP设计从根本上来说是有缺陷的,因为定义关键字的
#s(即
浮点
)会导致未定义的行为,并且您不能重新定义内置类型(即
浮点

因此,我想知道,我是否应该采用这种方法

链接问题的公认答案是一种很好的方法:根据预处理器定义,使用
typedef
。能够在
浮点
double
类型之间切换有时很有用。如果你认为你需要这样做,那么你应该这样做

特别是考虑到我正在处理的项目范围有多大

程序越大,除非使用
typedef
,否则就越难更改要切换其类型的所有变量

那么,正如前面提到的链接,我是否只对第一个ifdef子句执行typedef double float,然后对其他子句执行typedef float,或者它是typedef float

不,不要那样做

相反,修改现有代码并更改所有应可切换的类型,以使用typedef而不是
float

如果要这样做(但不要这样做),那么
typedef float
是没有意义的。您根本不需要ifdef的另一端

我是否需要更改附加到已就位浮点数的实例化值的f,或者它们是否可以保留

您应该使用最高精度的文本(
double
,在本例中)以避免丢失精度。但在表达式中使用文字之前,应始终转换文字,以避免与精度相关的错误

如果您支持C++14,则可以使用用户定义的文字进行转换:

// the typedef
#ifdef USE_DOUBLE_PRECISION
typedef double float_t;
#else
typedef float float_t;
#endif

// user defined literal
float_t operator "" _f(long double value) {
    return value;
}

// example
float_t approximate_pi = 3.14_f;
否则,

因此,我想知道,我是否应该采用这种方法

链接问题的公认答案是一种很好的方法:根据预处理器定义,使用
typedef
。能够在
浮点
double
类型之间切换有时很有用。如果你认为你需要这样做,那么你应该这样做

特别是考虑到我正在处理的项目范围有多大

程序越大,除非使用
typedef
,否则就越难更改要切换其类型的所有变量

那么,正如前面提到的链接,我是否只对第一个ifdef子句执行typedef double float,然后对其他子句执行typedef float,或者它是typedef float

不,不要那样做

相反,修改现有代码并更改所有应可切换的类型,以使用typedef而不是
float

如果要这样做(但不要这样做),那么
typedef float
是没有意义的。您根本不需要ifdef的另一端

我是否需要更改附加到已就位浮点数的实例化值的f,或者它们是否可以保留

您应该使用最高精度的文本(
double
,在本例中)以避免丢失精度。但在表达式中使用文字之前,应始终转换文字,以避免与精度相关的错误

如果您支持C++14,则可以使用用户定义的文字进行转换:

// the typedef
#ifdef USE_DOUBLE_PRECISION
typedef double float_t;
#else
typedef float float_t;
#endif

// user defined literal
float_t operator "" _f(long double value) {
    return value;
}

// example
float_t approximate_pi = 3.14_f;

否则,

不使用预处理器会有一个缺陷,即在不更改代码的情况下无法切换类型。使用预处理器定义(如VBM链接问题的答案中所建议的),您可以在编译时更改typedef,而无需接触代码。在每种情况下,声明都是:
typedef双浮点
------------------------------------
#ifdef USE#u DOUBLES typedef double float#其他类型的浮动#endif
我将如何申请使用声明?否,否,以及进一步的否。相应地,答案已编辑。@user207933请参阅关于使用预处理器定义关键字的编辑。不使用预处理器有一个缺陷,即在不更改代码的情况下无法切换类型。使用预处理器定义(如VBM链接问题的答案中所建议的),您可以在编译时更改typedef,而无需