C:标题中的原型声明和实现的函数声明之间的区别?

时间:2009-04-05 16:05:28

标签: c prototype declaration

我想知道在头文件和.c文件中声明函数原型之间的细微差别。我有一个带有一些原型函数的头文件和一些带有这些函数实际实现的.c文件。我在标题中做了一些更改,只添加了“__restrict”限定符(由gcc识别)。我的问题是我是否必须将._文件中的“__restrict”限定符放入(目前代码编译,所以我猜答案是否定的,但有些精确性会受到赞赏)。

这适用于每个C限定符吗?我可以在标题中添加一些“const”或“volatile”而无需在.c文件中执行相同操作吗?

目前在标题中:

int myfunc_gettype (const mytype *__restrict, int *__restrict);

并在实施文件中:

int myfunc_gettype(const mytype *attr, int *type)

3 个答案:

答案 0 :(得分:5)

必须。不匹配调用未定义的行为。您是否有理由在标题和定义中单独声明?

请注意,关键字为restrict,而不是作为供应商扩展的__restrict(提示:查看关键字名称前的_)。你应该坚持标准版本的便携性。

答案 1 :(得分:-1)

使用gcc 4.0.1,它取决于const是否毫无意义:

// Who cares, compiles fine, but irks the maintenance programmer.

// f.h
int f(const int i);

// f.c
int f(int i) { return i += 42; }


// No no no no Your Types Conflict gcc will not stand for it

// f.h
int f(const int *pi);

// f.c
int f(int *pi) { return (*pi)+= 42; }

答案 2 :(得分:-2)

注意:您实际上没有添加'restrict'限定符。你只需要在原型中有不同的(可选的)变量名。

关于你的问题,如果不匹配的原型与实现#included一致,那么大多数优秀的C编译器都会捕获这个bug并抛出警告/错误。如果你有不匹配的原型,你可能会发现从细微崩溃到即时崩溃的问题。