0%
string 14&17
- cpp 使用s和sv可以使字符串包含\0而不被阶段
- 需要使用命名空间std::string_literals;
1 2 3 4 5 6 7 8
| char* s="ssss"; char cc="sssss"[0]; const char* ="sss"; std::string_literals; std::string p="sss"s; std::string_view q="qqqq"sv; std::string tt = "sss";
|
auto int& register int
- auto int 表示将变量存储到内存中
- register int 表示将变量存储到 寄存器中
1 2 3
| register int b;
int c = &b;
|
extern&static&inline
code
1 2 3 4 5
| static int x,y; int main(){ static int y; return ::y+x+y; }
|
例子
访问外部模块变量
1 2 3 4 5 6 7 8 9
| #include <iostream> using namespace std;
int main(){ extern int x; int y=x; return 0; }
|
访问外部模块变量
1 2 3 4 5 6 7 8 9
| #include <iostream> using namespace std; static int x=4; int main(){ extern int x; int y=x; return 0; }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13
| #include <iostream> using namespace std; static int x=4; int main(){ int x=5; { extern int x; int y=x; } return 0; }
|
const&volatile&constexptr&inline
const
volatile
- 本程序不修改,其他程序修改
- 编译器不会优化,因为值时刻在变化。
constexptr
- 将计算尽量放在编译阶段
- 初始化要用常量表达式初始化
- 常量表达式的计算是在编译时,才是常量表达式
- 由于跟踪入参和函数结果,如果使用常量调用,可以提前计算
inline
- inline 作用域就在当前模块,相当于默认加了static
- 用于优化,可能变量不存在,变为
- 对于函数,将调用展开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const volatile int z=3; constexpr y=z; const y=z;
constexpr y=5; y++;
constexpr int y=3+sizeof(printf("%d",x));
constexpr int f(int x){ return x*x; }
void main(){ int y = f(3); }
|
constexpr 不表示返回值不可修改
1 2 3 4 5 6 7 8 9 10
| constexpr int& f(int& x){ x=x*x; return x; } int main(){ const volatile int z=0; int x=5; f(x)=9; std::cout<<x<<std::endl; }
|
inline
例子
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; inline int x=4; int main(){ int y=x; return 0; }
|
- 下列代码显示重复定义
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; int x=4; int main(){ int y=x; return 0; }
|
改进 1
可以正常编译通过
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; static int x=4; int main(){ int y=x; return 0; }
|
改进 2
可以正常编译通过
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; inline int x=4; int main(){ int y=x; return 0; }
|
改进 3
可以正常编译通过
1 2 3 4 5 6 7 8
| #include <iostream> using namespace std; inline int x=4; int main(){ int y=x; return 0; }
|
外部函数
- 编译失败,因为inline 相当于static 外部模块访问不到
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std; inline int x=4; inline int f(){ return 0; };
int main(){ int y=x; return 0; }
|
1 2 3 4 5 6
| inline x=3 extern int f(); int g(){ return f(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| #include <iostream> using namespace std; inline int x=4; int f(){ return 0; };
int main(){ int y=x; return 0; }
|
1 2 3 4 5 6
| inline x=3 extern int f(); int g(){ return f(); }
|