内联函数、ROP、头文件、namespace、宏

# Lecture 07

# 程序组织

image-20221004194251637

# 头文件

image-20221004194306679

# 作用域

程序级

文件级

函数级

块级

# 生命周期

main 函数中的变量的生命周期一般是整个程序。

idle pointer

# 头文件中包含的内容

  1. 常量定义

    image-20221004195026698

  2. 变量 / 函数定义

    image-20221004194957282

  3. 编译预处理

  4. 类型定义(class\ 接口)

  5. 内联函数

# include"a.h"

井号

编译预处理,把头文件的复制过来

static

只要不在头文件中,就不能更改 —— 加上 static ,把变量或者函数的程序级限制到文件级

const

默认属性是 static

写在另外 "const.h" 文件中

# namespace

# 两种形式

image-20221004195211541

  • declaration (绝对路径)
  • directive(批量处理)

# details

image-20221004200112776

  1. 别名

    namespace American_Telephone_and_Telegraph {…… } 
    …….  
    namespace ATT = American_Telephone_and_Telegraph
  2. 全局

    int  a;
    namespace X
    {   int a;
         void f()
        {   int a=0;
             a++;
             X::a++;
             ::a++;
        }
    }
  3. 开放

    可以在代码别的位置重新增加函数、变量

    namespace A
    {   int a;
         …….
    }
    …….
    namespace A
    {   void f() ;
         …….
    }
  4. 可嵌套

    软工::三班::quasdo

    namespace L1
    {   int a;
        
         ……. 
         namespace L2
        {   void f() ;
             …….
         }
    }
    ……..
    L1::L2::f(); 
    using namespace L1;
    L2::f();
  5. 重载

    namespace B
    {   void f(int) ;
         …….
    }
    namespace A
    {   void f(char) ;
         …….
    }
    void f();
    using namespace A;
    void g()
    {
       f(1);
    }

重载 —— 有可能造成冲突和语义的错误

可能在 namespace A 和 namespace B 中均定义了同一个函数名,因此不建议在同一作用域两次使用 using-directive

# 编译预处理

image-20221004195709681

gcc -7 -Dsqrt=rand -Dreturn=exit

define sqrt rand

虽然编译预处理可能会造成问题,但因为难以找到更好的结构且高效的替代品,没有取缔。

#

image-20221004195913290

while 后缺少;

形成完美的语句(不产生多余的空语句)

eight queen 八皇后问题,可用递归的方式求解