1

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

这对每个 C 限定符都有效吗?我可以在标题中添加一些“const”或“volatile”而不必在 .c 文件中执行相同的操作吗?

目前在标题中:

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

并在实现文件中:

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

3 回答 3

4

必须。不匹配会调用未定义的行为。是否有某些原因需要在标题和定义中分别声明?

请注意,关键字restrict与供应商扩展名相反__restrict(提示:查看_关键字名称之前的 's)。您应该坚持使用标准版本以实现可移植性。

于 2009-04-05T16:13:14.633 回答
-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; }
于 2009-04-05T16:27:01.823 回答
-2

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

至于您的问题,如果不匹配的原型与实现一起#included,大多数优秀的 C 编译器都会捕获此错误并引发警告/错误。如果您有不匹配的原型,您可能会看到从细微到即时崩溃的各种问题。

于 2009-04-05T16:25:20.813 回答