gpt4 book ai didi

c++ - 为什么 g++ 4.8.1 会发出转换警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:21 24 4
gpt4 key购买 nike

当我以这种方式用 g++ 4.8.1(64 位)编译下面的代码时:

$ g++ -Wconversion -o main main.cpp

我得到这个结果:

main.cpp: In function ‘int main()’:
main.cpp:12:20: warning: conversion to ‘int’ from ‘long unsigned int’ may alter its value [-Wconversion]
int i = sizeof(x)/sizeof(x[0]);
^

我的期望是编译器应该能够在编译时计算表达式。如果您用普通的 c 编写类似的程序,gcc 的工作就像一个魅力。

这应该被认为是 g++ 中的错误(例如 clang++ 没有这个问题)吗?

如果您将有问题的行更改为:

char c = 0x10000000/0x1000000;

那么编译器就不会报错了。这表明在警告生成之前进行了一些持续评估。

主要.cpp:

#include <iostream>

struct foo {
int a;
int b;
};

foo x[50];

int main()
{
int i = sizeof(x)/sizeof(x[0]);
std::cout << i << std::endl;

return 0;
}

最佳答案

 int i = sizeof(x)/sizeof(x[0]);
//int <-- std::size_t <-- std::size_t / std::size_t

表达式 sizeof(x)/sizeof(x[0]) 的类型是 std::size_t 在你的机器上是 unsigned long int 。因此,如果源的大小大于目标的大小,那么从这种类型到 int 的转换就是数据丢失。

不过,我同意在您的情况下,如果编译器实际上 计算该值,则不会实际数据丢失,但我想它适用 -Wconversion实际 计算之前。

关于c++ - 为什么 g++ 4.8.1 会发出转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21163750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com