【发布时间】:2015-11-13 20:54:02
【问题描述】:
我是一名 Java 程序员,我学过一点 C++,现在我正在为我的工作学习一点 C。 我无法理解关于函数声明/定义和相关函数调用的 C 行为。 从 K&R 我知道在 C 中(与 C++ 非常不同)我可以调用以前没有声明过的函数,并且编译器会假定类型的隐式声明:
int main()
{
function(10); // implicit function declaration ( int function() )
}
而且我知道这样的声明意味着一个函数接受固定但不定数量的任何类型的参数(只要每个调用与其他调用一致)。我知道这是 C89 之前的 K&R C,但我也想知道它是如何工作的。 现在,我有这个测试代码,我看不懂:
#include <stdio.h>
function();
int main()
{
printf("hello %d",function(1,2,3));
implicit(11,12,32); // implicit function declaration ( implicit() )
}
int implicit(int b)
{
}
function(int a)
{
}
在 function 的情况下,声明(假定返回类型为 int,不假设参数)确实与定义匹配(编译器发出警告)但如果我用错误的参数调用函数,它编译!
函数implicit 相同。
看不懂。。
【问题讨论】:
-
这类问题正是 C++ 需要提前声明函数的原因。这是我在 C 中坚持的做法。
-
这是旧式的、已弃用的、糟糕的代码。作为一个 C 初学者,你真的需要知道糟糕的代码是如何工作的吗?
-
是的,C 需要 .h 文件来放置函数定义(原型)。它将假定它们在编译时存在于某个地方,然后在运行时失败。看看 stdio.h 文件。
-
@n.m.是的,因为我偶然发现了它,因为例如,不带参数的函数声明是一个不为我接受参数的函数,了解不推荐使用(但编译器支持)的代码有助于我了解要避免的编码风格
-
如果你正在为你的工作学习 C,你应该学习一些有用的东西,比如如何正确地声明一个具有格式良好的函数原型的函数。而且您应该使用现代编译器,当您出错时会发出警告。最重要的是,修复编译器警告您的所有内容。永远不要忽视警告。
标签: c declaration definition