C++ 为一个复杂的长期项目而进行的老式铸造
有人能指出我在哪里/如何摆脱长变量C++ 为一个复杂的长期项目而进行的老式铸造,c++,C++,有人能指出我在哪里/如何摆脱长变量延迟的旧式强制转换警告吗 time\t时间戳; 时间戳; int tod; #定义一百万 #以天(长)为单位定义USEC\u 8640000000 长延迟=((时间戳%SEC_IN_DAY)*一百万+时间戳_us-long(tod*一百万)+USEC_IN_DAY)%(USEC_IN_DAY); xxxx.cpp:130:警告:使用旧样式转换[-Wold样式转换] 延迟=((时间戳%SEC_IN_DAY)*一百万+时间戳长度(tod*一百万)+USEC_IN_
延迟的旧式强制转换警告吗
time\t时间戳;
时间戳;
int tod;
#定义一百万
#以天(长)为单位定义USEC\u 8640000000
长延迟=((时间戳%SEC_IN_DAY)*一百万+时间戳_us-long(tod*一百万)+USEC_IN_DAY)%(USEC_IN_DAY);
xxxx.cpp:130:警告:使用旧样式转换[-Wold样式转换]
延迟=((时间戳%SEC_IN_DAY)*一百万+时间戳长度(tod*一百万)+USEC_IN_DAY)%(USEC_IN_DAY);
警告消息指向timestamp_us
,但不确定这是否是问题所在。我应该使用static\u cast
?如果是,在哪里?我所尝试的一切都不能消除错误
将重新解释\u cast
放在时间戳\u us
前面似乎可以清除这一部分(我认为),但是使用静态\u cast
进行长(tod*一百万)
不起作用
有什么想法吗?问题在于USEC\u IN\u DAY
宏。(long)
是一个老式的演员阵容。问题在于USEC\u IN\u DAY
宏。(long)
是一种旧式的强制转换。这是因为#define
宏是内联到代码中的:它们不是由编译器“智能”处理的,因为它们是由预处理器而不是编译器处理的
因此:
#define USEC_IN_DAY (long)8640000000
long latency = ( ( timestamp % USEC_IN_DAY ) * ONE_MILLION + timestamp_us - long( tod * ONE_MILLION ) + USEC_IN_DAY ) % ( USEC_IN_DAY );
编译器将其视为:
long latency = ( ( timestamp % (long)8640000000 ) * ONE_MILLION + timestamp_us - long( tod * ONE_MILLION ) + (long)8640000000 ) % ( (long)8640000000 );
…里面塞满了C型铸件
如果你用C++编写,<强>然后用C++ <强>写。不要让C中的习语和惯例蔓延到C++项目中。只是因为一个好的C99前C块与C++是相互理解的,这并不意味着把N’粘贴从C复制到C++中是个好主意。
如果使用全局
const
值,则可以完全避免这些问题。价值观
也就是说,复杂的单行表达式很难阅读。如果使用命名变量保存中间结果,则代码更容易理解:
long getLatency( time_t timestamp, suseconds_t timestamp_us, int tod ) {
const long one_million = 1000000L;
const long usec_in_day = 8640000000L;
const long sec_in_day = 86400L;
//
auto a = ( timestamp % usec_in_day ) * one_million;
auto b = tod * one_million;
auto c = a + timestamp_us - b + usec_in_day;
auto latency = c % usec_in_day;
return latency;
}
int main()
{
time_t timestamp; // Note that you cannot assume that `time_t` always represents timestamps using the Unix timestamp system.
suseconds_t timestamp_us;
int tod;
//
long latency = getLatency( timestamp, timestamp_us, tod );
return 0;
}
这是因为#define
宏是内联到代码中的:它们不是由编译器“智能”处理的,因为它们是由预处理器而不是编译器处理的
因此:
#define USEC_IN_DAY (long)8640000000
long latency = ( ( timestamp % USEC_IN_DAY ) * ONE_MILLION + timestamp_us - long( tod * ONE_MILLION ) + USEC_IN_DAY ) % ( USEC_IN_DAY );
编译器将其视为:
long latency = ( ( timestamp % (long)8640000000 ) * ONE_MILLION + timestamp_us - long( tod * ONE_MILLION ) + (long)8640000000 ) % ( (long)8640000000 );
…里面塞满了C型铸件
如果你用C++编写,<强>然后用C++ <强>写。不要让C中的习语和惯例蔓延到C++项目中。只是因为一个好的C99前C块与C++是相互理解的,这并不意味着把N’粘贴从C复制到C++中是个好主意。
如果使用全局
const
值,则可以完全避免这些问题。价值观
也就是说,复杂的单行表达式很难阅读。如果使用命名变量保存中间结果,则代码更容易理解:
long getLatency( time_t timestamp, suseconds_t timestamp_us, int tod ) {
const long one_million = 1000000L;
const long usec_in_day = 8640000000L;
const long sec_in_day = 86400L;
//
auto a = ( timestamp % usec_in_day ) * one_million;
auto b = tod * one_million;
auto c = a + timestamp_us - b + usec_in_day;
auto latency = c % usec_in_day;
return latency;
}
int main()
{
time_t timestamp; // Note that you cannot assume that `time_t` always represents timestamps using the Unix timestamp system.
suseconds_t timestamp_us;
int tod;
//
long latency = getLatency( timestamp, timestamp_us, tod );
return 0;
}
您发布的代码无法编译。您尚未在天中定义秒。此外,您还应该使用<代码> const <代码> conExpRP<代码>,而不是< C++ >定义C++中的常量。您应该使用数字文字类型说明符,而不是内联C样式转换。对不起,在第86400天定义秒,最简单的方法是使文字变长:。定义一百万1000000L
,在第864000000L
天定义USEC\u,并删除所有长(
转换。您发布的代码不会编译。您尚未在天中定义秒。此外,您还应该使用<代码> const <代码> conExpRP<代码>,而不是< C++ >定义C++中的常量。您应该使用数字文字类型说明符,而不是内联C样式转换。对不起,在第86400天定义秒,最简单的方法是使文字变长:。定义一百万1000000L
,在第864000000L
天定义USEC\u,并删除所有的长(
转换。非常感谢。我没有意识到:“这是因为#定义宏是内联到你的代码中的:它们不是由编译器“智能地”处理的,因为它们是由预处理器而不是编译器处理的。”其他人写了这段代码,我不喜欢它给出的警告。“这是因为#定义宏是内联到你的代码中的”:不,不是。这是因为有很多旧的样式表。@ USE20721我写了,因为(从第一手经验),C语言和C++的人来自更现代的语言,他们对编译器如何工作有许多假设(例如:<代码>(长)。
在#define
中强制转换将不会内联到实际编译的程序代码中)。我回答的目的是解决OP潜在的误解或误解,我认为这是OP问题的“真正”原因——不管您提到的具体技术细节。非常感谢。我没有意识到:“这是因为#定义宏是内联到你的代码中的:它们不是由编译器“智能地”处理的,因为它们是由预处理器而不是编译器处理的。”其他人写了这段代码,我不喜欢它给出的警告。“这是因为#定义宏是内联到你的代码中的”:不,不是。这是因为有很多旧的样式表。@ USE20721我写了,因为(从第一手经验),C语言和C++的人来自更现代的语言,他们对编译器如何工作有许多假设(例如:<代码>(长)。
在#define
中强制转换将不会内联到实际编译的程序代码中)。我的回答的目的是解决OP潜在的误解或误解,我认为这是OP问题的“真正”原因——不管具体的技术细节如何