命名空间定义语法为namespace 名称 { 成员 },末尾不加分号;加了会导致编译错误expected unqualified-id before ‘}’ token,因其是声明性语句而非函数或类定义。

命名空间定义不加;,加了就报错expected unqualified-id before ‘}’ token
namespace 后面直接跟花括号,不能加分号
这是新手最常踩的坑:把 namespace 当成函数或类声明,习惯性在右大括号后加分号。C++ 规定命名空间定义是声明性语句,不是声明+定义组合体,结尾不需分号。
- ✅ 正确:
namespace MyLib { int version = 1; void init(); } - ❌ 错误:
namespace MyLib { int version = 1; };(多出的;会导致编译失败)
命名空间里能放什么
几乎所有合法的声明和定义都允许出现在命名空间内,但要注意作用域限制:
- 支持:
int变量、void func()函数、class/struct、enum、typedef、using别名、甚至嵌套的namespace - 不支持:预处理指令(如
#define)、函数体外的表达式(如version = 2;单独写一行) - 变量可以带初始化:
int count = 0;是合法的定义;但count = 1;单独出现就是错误
同名命名空间可跨文件合并
同一个命名空间可以多次定义,编译器会自动把所有同名定义合并为一个逻辑命名空间——这在实际工程中非常关键:
立即学习“C++免费学习笔记(深入)”;
- 头文件
mylib.h中放声明:namespace MyLib { void setup(); } - 源文件
mylib.cpp中放实现:namespace MyLib { void setup() { /* ... */ } } - 两个定义不冲突,
MyLib::setup()可正常调用 - 注意:无名命名空间(
namespace { ... })例外,它只在当前翻译单元有效,不会合并
真正容易被忽略的是“分散定义”这个特性——它让接口与实现分离变得自然,但很多人第一次遇到跨文件调用失败时,第一反应是检查拼写或 include 路径,而忘了命名空间本身是可拆分的。


















