是的,我认为规范中有歧义.采取
_Atomic int (*f)(int);
这里_Atomic是一个类型限定符. (作为一个函数的返回类型,它不太有意义,但是有效,我认为).现在采取这种替代形式
int _Atomic (*f)(int);
通常类型限定符可以在int之后,这应该等同于其他声明.但是现在_Atomic之后是括号,所以它必须被解释为一个类型说明符,然后是语法错误.我认为甚至可以做一个例子,其中* f可以被一个有效的typedef替换.
看看第6.7.2.4 p4段的第一句话
The properties associated with atomic types are meaningful only for
expressions that are lvalues.
这清楚地表明他们不希望返回类型的函数被_Atomic限定.
编辑:
会发生同样的歧义
_Atomic int (*A)[3];
这是完美的意义(指向三个原子整数的数组),我们应该能够重写
int _Atomic (*A)[3];
编辑2:要看到括号中的类型的标准不消除歧义,请使用以下有效的C99代码:
typedef int toto;
int main(void) {
const int toto(void);
int const toto(void);
const int (toto)(void);
int const (toto)(void);
return toto();
}
这是一个功能的重要部分.所有四行都是相同功能的有效原型.现在使用_Atomic作为限定词
typedef int toto;
int main(void) {
int _Atomic (toto)(void);
return toto();
}
这应该是有效的作为与const的版本.现在我们在这里有一个案例,其中_Atomic后跟括号里面有一个类型,但它不是一个类型说明符.