Skip to content

语句

约 503 个字 20 行代码 预计阅读时间 3 分钟

switch

  • 内部变量定义,使用花括号;只定义在该块内

try语句块和异常处理

  • throw表达式
  • try{...}catch(runtime_error e){...}

标准异常

  • excception:头文件中定义了通用的异常类exception。只报告异常的发生,不提供额外的信息
  • stdexcept:定义了集中常用的异常类
  • new头文件定义了bad_alloc
  • type_info头文件定义了bad_cast异常类型

  • 异常类型只有一个what成员函数,返回值是一个C风格字符串

Header guards(include guard)

  • 避免一个头文件被多次引用
C++
int getSquareSides()  // from square.h
{
    return 4;
}

int getSquareSides() // from wave.h (via square.h)
{
    return 4;
}

int main()
{
    return 0;
}
C++
#ifndef SOME_UNIQUE_NAME_HERE
#define SOME_UNIQUE_NAME_HERE

// your declarations (and certain types of definitions) here

#endif

Header guards do not prevent a header from being included once into different code files

  • 如果在头文件进行函数定义,如果有多个源文件可能造成链接失败,多次定义同一个函数
  • The best way to work around this issue is simply to put the function definition in one of the .cpp files so that the header just contains a forward declaration:

  • Now when the program is compiled, function getSquareSides will have just one definition (via square.cpp), so the linker is happy. File main.cpp is able to call this function (even though it lives in square.cpp) because it includes square.h, which has a forward declaration for the function (the linker will connect the call to getSquareSides from main.cpp to the definition of getSquareSides in square.cpp).

#pragma once

  • 为了避免同一个头文件被Include多次

  • #pragma once 并不是C++的原生语法,而是编译器的一种支持,所以并不是所有的编译器都能够支持。#ifndef 则为C++的标准

  • #ifndef 依赖于不重复的宏名称,保证了包含在 #endif 的内容不会被重复包含,这个内容可以是一个文件的所有内容,或者仅仅是一段代码。而 #pragma once 则是针对物理文件的一个标记,标记该文件不会被 #include 多次,不能只针对文件中某段代码进行标记。而且,#pragma once 不能保证多个文件的拷贝不会被重复包含