C函数工作时不指定参数的数据类型

时间:2017-11-09 17:29:04

标签: c mpi

我错误地在MPI中使用了以下功能 -

double f(x) {
  return(4.0/(1 + x*x));
}

请注意,我没有在上面的代码中声明x的数据类型。

然后使用:

编译它
mpicc q.c -o q

程序仍然没有抛出错误并成功编译。

使用包装器时,我得到以下f -

的值

f(2)= 0.8

f(1)= 2

如何在没有错误的情况下正常工作?

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是一个好的开始。