我刚碰巧看了printf(和其他fprintf类函数)的原型-
int printf(const char * restrict format, ...);
Run Code Online (Sandbox Code Playgroud)
restrict如果我理解正确的关键字,如果标记了其中一个,则禁止通过两个指针访问同一个对象restrict.
这里引用了与C标准相同的例子.
restrict我认为标记格式的一个好处是保存函数,使其不会在执行期间修改格式字符串(比如因为%n格式说明符).
但这是否会产生更大的约束?这会使以下函数调用无效吗?
char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)
因为这里有明显的别名.为什么将restrict关键字添加到format参数中printf?
cppreference
期间在该受限制的指针的块的每个执行
P被声明(通常是功能体,其中的每一次执行P是一个函数参数),如果一些对象,它是通过可访问的P(直接或间接)被修改,以任何方式,则所有对该块P中的对象(包括读取和写入)的访问必须通过(直接或间接)进行,否则行为是未定义的.
(强调我的)
这意味着:
char format[] = "%s";
printf(format, format);
Run Code Online (Sandbox Code Playgroud)
定义明确,因为printf不会尝试修改format.
唯一restrict未定义的是'使用%…nwhile printf运行时写入格式字符串'(例如char f[] = "%hhn"; printf(f, (signed char *)f);).
为什么
restrict关键字被添加到格式参数printf?
restrict 本质上是编译器可能用来更好地优化代码的提示.
由于restrict可能会或可能不会使代码运行得更快,但它永远不会让它变慢(假设编译器是理智的),它应该始终使用,除非: