我错误地在MPI中使用了以下功能 -
double f(x) {
return(4.0/(1 + x*x));
}
请注意,我没有在上面的代码中声明x
的数据类型。
然后使用:
编译它mpicc q.c -o q
程序仍然没有抛出错误并成功编译。
使用包装器时,我得到以下f
-
f(2)= 0.8
f(1)= 2
如何在没有错误的情况下正常工作?
答案 0 :(得分:2)
在旧样式C中,任何使用名称但没有类型变量声明的类型都为int
。因此,fuction将采用整数参数,并且在表达式中它将被提升为double。
更新
在C的预标准版本中,在第一个标准化版本中,默认情况下,没有类型声明的C89变量类型为int
。在C99和连续标准中删除了这种行为。人们可以在Kernigan& Ritchie的书C Programming Language, 2nd Edition
中读到它。
答案 1 :(得分:2)
double f(x) {
return(4.0/(1 + x*x));
}
这是因为(a)C仍然允许一些被认为是过时的旧功能,并且(b)你没有要求你的编译器强制执行当前版本的语言。
在现代C中,应使用 prototype 声明/定义函数,该声明指定任何参数的类型:
double f(int x) {
/* ... */
}
预ANSI-C(1989年之前)不支持原型,并且使用不同的语法定义函数参数。例如,您可以写:
double f(x)
int x;
{
/* ... */
}
调用者看不到参数的类型,因此使用非f
类型的参数调用int
可能会产生不可预测的结果。 (这显然是一个问题,这就是原型引入的原因。)此外,您可以省略int x;
行,类型将默认为int
。您可以省略double
返回类型,也可以默认为int
。
仍然允许使用旧式声明,但使用它们并不是一个好主意。隐含的int
规则在1999年标准中被删除。
你应该找出如何让你的编译器强制执行现代C的规则。如果你正在使用gcc,那么gcc -std=c11 -pedantic
是一个好的开始。