• 应用程序内存空间(局部内存堆),程序进程结束时,会被统一都回收释放
  • 公共内存区(全局内存堆)(写设备驱动程序时会使用),使用不当会造成内存泄漏
  • extern 不能修饰其他模块的静态变量
  • 函数内用 extern 修饰的变量要么来自全局变量,要么来自本身模块的静态变量
  • extern 只能修饰外部变量(就近原则),不能修饰局部变量

test.cpp:

#include <iostream>

int etn = 3;		// 全局变量
static int s_m;		// 模块静态变量

void layout() {
	std::cout << "test.cpp\tetn=" << etn << std::endl;
}

another.cpp:

static int etn = 4; // 模块静态变量
void myFunc(){
    int etn = 5;    // 局部自动变量
	{
		extern int etn;
		int x = etn;// x 是 4 而不是 5
	}
}

charTest.cpp:

#include <iostream>
#include <locale>
void myPrint(){
    setlocale(LC_ALL, "chs");
    char16_t c1 = u'马';
    char32_t c2 = U'马';
	wchar_t x = u'马';
	wcout << x << endl;
}

main.cpp:

// 模块静态变量
static int x = -1, y = -2;
// 全局变量
int i;
// extern 全局变量
extern int etn;
// 错误,不能 extern 其他模块的静态变量
// extern int s_m;

// x y 也是全局变量,只不过共用一块内存
// 所以会与上面的 x y 冲突
// static union{
//     int x = 97;
//     char y;
// };

void layout();

int main()
{
    extern int x;           // OK 自身模块的静态变量
    x = 11;
    cout << ::x << endl;    // 11
    static int y = 10;      // 局部静态变量
    cout<< y << endl;       // 10
    cout << x << endl;      // 11
    cout << ::y << endl;    // -2 访问模块静态变量
    
    int xx = 555;
    // 八进制格式化打印
    int z = printf("%#o\n", xx);     // 01053
    // 十六进制格式化打印
    z = printf("%#x\n", xx);         // 0x22b
    // 打印数字 x 的位数
    char buf[256];
    z = sprintf(buf, "%d", xx);
    cout << z << endl;              // 3
    
    // 5 个固定宽度 左对齐
    printf("l%-5cr\n", 'A');        // lA    r
    // 8 位显示浮点数(包括小数点) 用 0 填充 小数位精确到 2 位
    printf("l%08.2fr\n", -20.405);  // l-0020.41r
    
    cout << strlen("abc") << endl;  // 3
    cout << sizeof("abc") << endl;  // 4
    string s = "abc"s;
    cout << s.length() << endl;     // 3
    cout << sizeof(s) << endl;      // x86 28
                                    // x64 32(Linux) 指针为 8 字节,32 位的为 4 字节

    etn = 4;
    layout();                       // test.cpp        etn=4

    return 0;
}