我理解restrict的用处,

void foo(size_t n, double * restrict a, double * restrict b) 

然而,查看printf个手册页,我们发现:

      int fprintf(FILE *restrict stream,
                   const char *restrict format, ...);

这两个指针都被标记为restricted,但是它们指向不同的类型,所以在我的理解中,它们无论如何都不能是别名(除非FILEchar的类型定义符),所以restrict不提供任何更多信息.

我是正确的,还是手册页显示了一个有效的用法?

推荐答案

两个指针都标记为restricted,但是它们指向 不同的类型,所以在我的理解中,它们无论如何都不可能是别名 (除非FILEchar的typedef),所以restrict不提供任何 更多信息

我说得对吗?还是手册页显示了一个有效的用法?

你说得不对.

首先,指针值可以转换为不同的指针类型,因此不能仅根据类型假设无别名,至少在函数调用接口上不能.原则上,该函数可以将FILE *转换为char *,并使用结果访问指向的任何数据. 这甚至不需要违反严格的别名规则,但根据细节,它违反了restrict限制.

但在这方面更合理的问题是,如果FILE是一种 struct 类型(通常是这样),并且对此函数的调用的第二个参数指向指向FILE的 struct 的a member.对该成员的修改可能会违反restrict的资格.

此外,您忽略了fprintf()接受任意数量的附加参数,并且原则上它可以访问外部对象.restrict强加的非混叠要求不是关于符合restrict条件的指针对.它们是关于相对于修改对象的任何其他方式的个人restrict限定的指针.

最后,即使我们可以从函数签名中得出结论(与实际情况相反),没有相关的别名是可能的,这也不会使restrict的使用无效.这只会是多余的.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

如何避免重新分配指针数组时,我们从一开始就不知道确切的大小

球体—立方体重叠:无、部分或全部?

单指针和空参数列表之间的函数指针兼容性

C编译器是否遵循restrict的正式定义?

如何跨平台处理UTF-16字符串?

在编译时参数化类型定义

为什么即使在强制转换时,此代码也会溢出?

轮询libusb_pollfd struct 列表的正确方式是什么?

Flose()在Docker容器中抛出段错误

getline()从c中的外部函数传递指针时输出null

cairo 剪辑区域是否存在多个矩形?

C:在编译时构建和使用字符串文字的预处理器宏?

如何在C-函数中混合使用C代码和ASM?

C语言中MPI发送接收字符串时出现的分段错误

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

malloc:损坏的顶部大小无法找出问题

React Native Android C++ TurboModules 静态 C 库链接问题