extern int i; int ::i; int main() { }
gcc抱怨说:
error: explicit qualification in declaration of `i`
这是不符合要求的行为吗?标准中的哪个部分被视为格式错误?
8.3p1似乎表明应该允许:
If the
qualifier is the global :: scope resolution operator,the declarator-id refers to a name declared in the global
namespace scope.
更新:
从N3485 8.3p1:
A list of declarators appears after an optional (Clause 7) decl-specifier-seq (7.1). Each declarator contains
exactly one declarator-id; it names the identifier that is declared. An unqualified-id occurring in a declarator-
id shall be a simple identifier except for the declaration of some special functions (12.3,12.4,13.5) and for the
declaration of template specializations or partial specializations (14.7). When the declarator-id is qualified,
the declaration shall refer to a prevIoUsly declared member of the class or namespace to which the qualifier
refers (or,in the case of a namespace,of an element of the inline namespace set of that namespace (7.3.1))
or to a specialization thereof; the member shall not merely have been introduced by a using-declaration
in the scope of the class or namespace nominated by the nested-name-specifier of the declarator-id. The
nested-name-specifier of a qualified declarator-id shall not begin with a decltype-specifier. [ Note: If the
qualifier is the global :: scope resolution operator,the declarator-id refers to a name declared in the global
namespace scope. — end note ] The optional attribute-specifier-seq following a declarator-id appertains to
the entity that is declared.
解决方法
A declarator-id shall not be qualified except for the definition of a member function or static data member outside of its
class,the definition or explicit instantiation of a function or variable member of a namespace outside of its
namespace,or the definition of an explicit specialization outside of its namespace,or the declaration of a
friend function that is a member of another class or namespace.
在例外中没有提到全局变量的定义.