C++ 通过C+中的预处理器定义构建不同的数据类型+;
我想快速、正确地将float的用法改为double,有人建议,这可以通过正确使用预处理器定义来实现。不幸的是,我从未这样做过,但我在这里遇到了以下答案: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
因此,我想知道,如果这个方法是我应该如何进行的,特别是考虑到我正在处理的程序的范围有多大,还是我应该使用另一种方法?如果是另一种方法,每个人都会有什么建议?如果不想使用预处理器,则要使用
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,而无需