我正在测试C ++的名称查找规则,我有一个包含3个文件的简单程序:
$cat testns01.h
struct S{
static int f(){return 1;}
};
$cat testns02.h
namespace S{
static int f(){return 2;}
}
$cat testns3.cpp
#include "testns02.h" // namespace
#include "testns01.h" // struct
#include<stdio.h>
int main()
{
int i = S::f();
printf("%d\n",i);
return 0;
}
如果我编译并运行,我得到:
$g++ testns3.cpp && ./a.out
1
好的,我有3个问题:
如果我评论#include&#34; testns01.h&#34;的行,程序将打印2,仍然可以。所以我的第三个问题是:
谢谢!
答案 0 :(得分:2)
- 名称“S”在类名和命名空间之间重复不冲突吗?
醇>
他们这样做。
- 当两者都有名字“S”时,似乎“struct S”具有更高的优先级
醇>
没有。 (见下文)
- 关于名称查找是如何解决重复名称重复问题的c ++标准吗?
醇>
是。引用N4140的相关部分:
§3.3.1[basic.scope.declarative] / 4
在单个声明性区域中给出一组声明,每个声明 它指定相同的非限定名称,
- 他们都应该引用同一个实体,或者全部引用功能和功能模板;或
- 正好一个声明应声明一个不是typedef名称的类名或枚举名,其他声明应全部 引用相同的变量或枚举,或全部引用函数 和功能模板;在这种情况下,类名或枚举 名称是隐藏的。 [注意: 命名空间名称或类模板名称 必须在其声明区域中是唯一的。 - 结束记录]
我认为你不小心让你的榜样为你工作,因为你重复了包含警卫。我能够从问题:
重现课程S
的“偏好”
#ifndef FOO
#define FOO
struct S{
static int f(){return 1;}
};
#endif
#ifndef FOO
#define FOO
namespace S{
static int f(){return 2;}
}
#endif
#include<stdio.h>
int main()
{
int i = S::f();
printf("%d\n",i);
return 0;
}