【发布时间】:2021-11-08 11:54:22
【问题描述】:
标准的 6.5.16 章节有 2 段:
在简单赋值(=)中,右操作数的值为 转换为赋值表达式的类型并替换 值存储在左操作数指定的对象中。
和
左操作数具有原子的、合格的或不合格的算术 类型,右边是算术类型;
所以考虑下面的代码:
float f = 1.2f;
int i = f; //error
i 和 f 都具有算术类型,因此应将 f 转换为 i。但是编译代码会产生错误:
error: conversion from ‘float’ to ‘int’ may change value [-Werror=float-conversion]
6 | int i = f;
但是当添加显式转换时,它编译得很好:
float f = 1.2f;
int i = (int) f; //ok
那么在赋值表达式中允许什么样的转换呢?我虽然标准中的转换相当于强制转换(type)。
更新:
GCC 9.3.0
这是我的旗帜:
-Werror
-Wextra
-pedantic
-Wconversion
-g3
-O3
-Wno-unused-result
-Wno-unused-parameter
-Wstrict-prototypes
【问题讨论】:
-
您的代码应该可以编译。这不是因为您已将编译器配置为将此警告视为错误。
-
-Werror表示“将每个警告都视为错误”。 -
-Werror将警告转换为错误。您的编译器可以很好地生成关于可能的值更改的警告,您要求它使其成为错误,而事实上,这是完全合法的。 -
严格遵守
gnu17?gnu17不符合标准...您可能需要添加-std=c11(或c99或c17...)gcc.gnu.org/onlinedocs/gcc/… -
您可能希望删除
-Werror并将其替换为-pedantic-errors(并添加-std=c??,如 pmg 所说)。然后你仍然会收到一致性问题的错误,但所有其他警告都不会变成错误。
标签: c language-lawyer assignment-operator