仅在声明中将指针指定为限制?

Specifying pointers as restrict only in declaration?

所以我的问题是这样的。如果在 header 文件中我有一个函数声明:

extern void func(void* restrict, void* restrict);

然后在源文件中,我这样定义它:

void func(void*, void*) {}

这是个问题吗? restrict 预选赛是否丢失?

P.S. 这样我就可以在C89模式下编译源文件并将header中的原型更改为带有条件宏的相应 C89/C99 版本。

"This is so I can compile the source file in C89 mode" - 简单的原因:restrict 在 C99 see forword of C11 之前不是保留关键字(C99 是第 2 版),所以它只是用作名称,这在原型中被忽略。

但是两个函数声明符(原型和定义)必须指定相同的类型,即两者都需要 restrict

您必须使用正确的 C 版本编译 header 和实现。对于 restrict,定义通常比原型更相关,但编译器可能能够检测到调用者中的违规行为。始终假设依赖此类 hack 会破坏您的代码。


评论过后,尝试一下千里眼:

如果您想让代码使用古老的 C90 进行编译,同时在有用的地方利用更新的功能,您可以使用宏:

#if this_is_c99_or_c11
#define RESTRICT retrict
#else
#define RESTRICT
#endif

void f(int * RESTRICT p);

...

void f(int * RESTRICT p)
{
    ...
}

还记得 cross-version 编译调用方和被调用方可能存在问题。检查目标的 ABI。