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问题的“真正”原因——不管具体的技术细节如何