0

理解抽象声明符及其使用对我来说花费了很多时间和精力。但令我惊讶的是,我刚刚阅读了函数声明中不需要抽象声明符。这是 Wikipedia ( LINK ) 所说的:

“重要的是要知道,函数的声明不需要包含原型。下面是一个无原型的函数声明,它只是声明了函数名及其返回类型,但没有说明函数的参数类型是什么。定义期望。

int fac();

"

那么这是否意味着我不需要在此声明中使用抽象声明符:

int fac(int);

?

请最终为我解决这个问题。我是否应该假设我们不需要在函数声明期间包含抽象声明符,但只建议这样做?

4

3 回答 3

2

是的,你可以只声明函数,而不是原型。

也就是说,这仅允许向后兼容。原型已经在这门语言中使用了几十年,而且每个头脑正常的人(完全使用 C 语言的人)基本上一直在使用原型。除非您真的需要编写与真正古老的编译器兼容的代码,否则编写使用函数声明而不是原型的新代码绝对没有任何好处(甚至是借口)。

于 2013-04-02T03:49:14.983 回答
0

我不确定你在问什么。“抽象声明器”是什么意思,是指函数原型吗?

函数原型是使用函数所必需的,否则函数必须在本地声明,并且必须在使用它的函数之上声明。

通过使用函数声明,您可以使您的函数在整个程序中全局可见,而不是简单地对其下面的函数可见。

总体而言,您的函数不是存储在您的标头中,而是存储在库中,然后链接到您的程序。

编译时,所有 C 函数(无论您喜欢与否)都链接到您的程序中。在您声明一个声明它的函数原型之前,您的程序根本不会注意到它们。

例如:

int printf(char *, ...);

int main()
{
    printf("hello, world!\n");
    /* puts("hello, world"); // I produce a warning. */
    return 0;
}

工作,不包括 stdio.h。

为了澄清以下评论中的问题:

void c();

void a() {

}

int main() {
    a();      // works
    b();      // error
    c();      // works
    return 0;
}

void b() {

}

void c() {}

希望这会有所帮助,但我仍然不确定你在问什么。

于 2013-04-02T03:49:08.873 回答
0

原型提供对其他编译单元的可见性。

它们还允许您不必构建代码,以便在调用之前进行定义。

在有人提出并说 xyzcc 用 2 pass 符号或其他什么来处理这个问题之前......不要在意,如果编写正确,C 可以移植;应该是。

于 2013-04-02T04:06:20.810 回答