没有以前的原型? [重复]

问题描述 投票:0回答:1

可能重复:
错误:没有以前的函数原型。为什么我会收到此错误?

我有一个在头文件中原型化的函数,但是 Xcode 仍然给我警告

No previous prototype for the function 'printBind'
。我以相同的方式制作了函数
setBind
原型,但在我的实现中没有收到此函数的警告。

CelGL.h

#ifndef Under_Siege_CelGL_h
#define Under_Siege_CelGL_h

void setBind(int input);
void printBind();

#endif

CelGL.c

#include <stdio.h>
#include "CelGL.h"

int bind;

void setBind(int bindin) { // No warning here?
    bind = bindin;
}

void printBind() { // Warning here
    printf("%i", bind);
}
c xcode function
1个回答
24
投票

在 C23 之前的 C 中,这样:

void printBind();

不是原型。它声明了一个不返回任何内容的函数 (

void
),但接受不确定的参数列表。 (但是,该参数列表不是可变的;所有采用可变长度参数列表的函数必须在范围内具有完整的原型以避免未定义的行为。)

void printBind(void);

这是不带参数的函数的原型。

C++ 中的规则不同 - 第一个声明一个不带参数的函数,与第二个相同。

造成差异的原因是历史性的(读作“可以追溯到 20 世纪 80 年代中期”)。当原型被引入到 C 中时(在被添加到 C++ 中几年后),有大量遗留的代码声明了不带参数列表的函数(因为在添加原型之前这不是一个选项),因此向后兼容性考虑意味着

SomeType *SomeFunction();
必须继续表示“一个返回
SomeType *
但我们对参数列表一无所知的函数”。 C++ 最终添加了
SomeType *SomeFunction(void);
符号以与 C 兼容,但并不需要它,因为类型安全链接很早就添加了,并且所有函数在定义或使用之前都需要在范围内有一个原型。

请注意,C23 最终使 C 与 C++ 保持一致,空括号表示法意味着函数声明是不带参数的函数的原型。

© www.soinside.com 2019 - 2024. All rights reserved.