#### 2.1.2 __func__ __func__ 宏:返回函数名称 c++11兼容c99标准 #### 2.1.4 变长参数宏以及__VA_ARGS__ ``` #define LOG(...){\ fprintf(stderr,"%s: Line %d:\t",__FINE__,__LINE__);\ fprintf(stderr,__VA_ARGS__);\ fprintf(stderr,"\n");\ } int main(){ int x=3; LOG("x=%d",x);//2-1-5.cpp: line 12: x=3 } ``` #### 2.4 宏__cplusplus 可以用于判断是否是c++编译环境,同时也可以判断c++版本,防止c++11程序在c++98编译器下编译 #### 2.5.1 assert宏定义在cassert头文件中 ``` assert(expr); ``` 首先对expr求值,如果表达式为假,assert输出信息,并且终止程序运行。为真则什么也不做。 在开头使用(需要写在cassert头文件之前,因为本质上还是宏判断) ``` #define NDEBUG ``` 可以跳过检测。在VC++里面,release会在全局定义NDEBUG。
既然定义了NDEBUG,还可以: ``` #ifndef //do any debug thing //__FILE__ 文件名字面值 //__LINE__ 当前行号字面值 //__TIME__ 文件编译时间字面值 //__DATE__ 文件编译时间字面值 //__func__ 函数名称 c++11兼容c99标准 //用于打印debug信息 #endif ``` ## error用法 ``` #ifndef UNIX #error This software requires the UNIX OS. #endif #if !defined(__cplusplus) #error C++ compiler required. #endif ``` #### 2.5.2 静态断言与static_assert 编译期断言 static_assert(false,"error string"); #### 2.6 noexcept修饰符和noexcept操作符 ``` void excpt_func() noexcept;//虽然这样函数就不会抛出异常,但是如果抛出了异常,程序会直接被终止 void excpt_func() noexcept(expr);//如果为true则不会抛出异常 ``` #### 2.9 扩展的friend语法 ``` class A{ }; class B{ friend class A;//都通过 }; class C{ friend B;//c++11通过,c++98失败 }; ``` 可以省略class直接声明类的友元,这个改动的意义在于类模板,不过使用内置对象时就会实例化成一个没有友元的类 ``` class A; template class People{ friend T; }; ``` #### 模板函数的默认模板参数 ``` template void func(){ } ``` #### 2.12.1 外部模板 在头文件中定义模板类的情况下,为了防止编译器给每个包含头文件的cpp文件生成代码,可以添加extern关键字。当然至少要有一个是不加extern的。 ``` template void func(T){ } extern template void func(int); ```