所以我看到头文件spawn.h大量使用' restrict':
const char* command = "whatever";
const char* args[] = {command, "--arg1", "--arg2"};
但我经常为exec系列调用使用的模式是:
execv(command, args);
现在,exec家庭,/不要/使用限制,所以我可以(忽略一些const演员)
posix_spawn(nullptr, command, nullptr, nullptr, args, __environ);
但是我(技术上)因为限制而无法执行以下操作:__ path和 __argv都被标记为受限制,因此无法指向同一个对象。
{{1}}
这是否在我不知道的某个深层次上是明智的? :-)
当然它全部都包含在宏中,所以也许从未启用它?
请注意,这个问题非常多地出现在假设和语言律师的土地上。我还没有找到一个强制执行此限制的编译或lint选项,当然也不是来自C ++,使用extern" C"但同样我不想在将来进入一个
答案 0 :(得分:0)
是的,它对posix_spawn
函数本身的编译器很有用。
它告诉编译器他可能对数组有什么假设。特别是它告诉第一个参数不能被字符数组别名:
char*
和类似的可以别名所有其他指针类型。
对于您和任何其他人(他们会将char*
转换为pid_t*
作为路径传递?)这可能是显而易见的,但这不是编译器。
类似的参数适用于其他数组。如果它们的基类型只是一些typedef
ed整数类型,编译器可能会怀疑别名,实际上它永远不会存在。
对于您展示的代码没有问题,因为restrict
保护它指向的对象,而不是其他引用的对象。如果有人想要,他必须使用像
char *restrict const __argv[restrict],
但这可能过于“限制性”,在这里。