C++ Primer终于快看完了。
真是越往后看的越慢,跳过了几章,今天直接看第18章命名空间部分,遇到了一个小问题。如下所示。
文件:
- np.h
`
c
#ifndef NP_H
#define NP_H
#include
namespace np{
class NpTest{
public:
void print();
private:
int val = 2;
};
void add(int &);
//int np_val;//这样不行,重复定义,用嵌套的匿名空间可以,如下所示(不太清楚为啥。。。)
namespace{
int np_val;
}
}
#endif
* np.cpp
```c
#include "np.h"
#include <iostream>
using namespace np;
namespace np{
void NpTest::print(){
std::cout << "val = " << val << std::endl;
}
void add(int &a){
++a;
}
}
- main.cpp
`
c
#include “np.h”
#include
using namespace std;
using namespace np;
namespace np1{
int np_val = 10;
}
namespace np1{
void test(){
++np_val;
}
}
int main(){
NpTest a;
a.print();
int x = 1;
add(x);
cout << x << endl;
np::np_val = 100;
cout << np::np_val << endl;
cout << np1::np_val << endl;
np1::test();
cout << np1::np_val << endl;
return 0;
}`
Problem: 其实就是注释的那一行,np_val存在重复定义问题。
就是每当np.h被include一次,np_val就被定义一次。
但是改成把np_val放到嵌套的匿名空间里就没有问题了。
现在还不太理解原因,待后面再看看。