Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中向函数传递参数时的隐式强制转换_C - Fatal编程技术网

C语言中向函数传递参数时的隐式强制转换

C语言中向函数传递参数时的隐式强制转换,c,C,假设我们有一个声明如下的函数: void myFunct(unsigned char a); 在我的主程序中,我这样称呼它myFunct(5000),并得到以下警告: “整数转换导致截断”。 编译器警告我传递的值大于255 无论如何,如果声明一个变量const ulong test=5000,我将其传递给myFunctmyFunct(test),编译器不会就相同的可能问题向我发出警告 有人能解释我的这种行为吗 这个丢失的警告在我的代码中造成了一个恼人的错误,我现在担心这些问题可能会出现在其他地

假设我们有一个声明如下的函数:

void myFunct(unsigned char a);
在我的主程序中,我这样称呼它
myFunct(5000)
,并得到以下警告: “整数转换导致截断”。 编译器警告我传递的值大于255

无论如何,如果声明一个变量
const ulong test=5000
,我将其传递给myFunct
myFunct(test)
,编译器不会就相同的可能问题向我发出警告

有人能解释我的这种行为吗

这个丢失的警告在我的代码中造成了一个恼人的错误,我现在担心这些问题可能会出现在其他地方

我尝试过不同的编译器,比如MinGW和GHS版本5(GreenHills),但都没有就报告的问题向我发出警告


有人能告诉我是否有办法防止此类问题吗?

编译器警告不需要任何逻辑。编译器试图就您可能想知道的问题生成有用的警告,并避免将您的时间浪费在误报上。满足这两个冲突目标的任何启发式都可以在编译器中实现

这里最可能的解释是,在
myFunct(5000)
中,转换显然无法保留值,而在
myFunct(test)
中,仅查看函数调用并不明显。关于后者的警告需要知道
test
在该点的值,并且编译器可能没有确定
test
在该点的值是否为
5000
的机制

虽然很明显,在这个特定示例中,
test
的值总是
5000
,但预测变量值的机制并非在所有情况下都能很好地工作(非常量变量的值很难预测)可能会阻止编译器编写者甚至尝试实现此类警告

静态分析器的目标与编译器不同。它们至少在简单的情况下尝试预测变量的值,并且在您的示例中,其中一些可以配置为针对
myFunct(test)
发出警告。大多数静态分析器仍然保留不发出警告的权利,如果他们不确定问题是否存在,并且您永远不知道他们是否确定。但是使用静态分析器比使用编译器更有可能得到警告


请注意,
myFunct(5000)
中的
myFunct
的参数发生了转换。强制转换是一种句法结构。没有所谓的“隐式转换”。

尝试静态C/C++代码分析工具:cppcheck、viva64等。我理解您的解释,我发现它是有效的。不管怎么说,我们正在考虑这个场景:假设有一个char mychar=mylong(其中mylong是5000)。在这种情况下,编译器会警告我。在我上面报告的函数调用的情况下,我期望有相同的行为。我错了吗?感谢您的回复和建议。@SimoneBonetti您让我想起了一句话,我本想在回答中包括,但忘记了:无法解析变量的实际值,只知道
测试的类型(这是静态信息,无论如何都必须计算,所以它是可用的),编译器通常避免对
myFunct(test)
发出警告,因为
test
可能是一个
ulong
变量,其中包含一个可表示为
无符号字符的值。