2023-06-29 11:55:02 +08:00

2.4 KiB
Raw Blame History

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 T>
class People{
  friend T;  
};

模板函数的默认模板参数

template<typename T=int>
void func(){
    
}

2.12.1 外部模板

在头文件中定义模板类的情况下为了防止编译器给每个包含头文件的cpp文件生成代码可以添加extern关键字。当然至少要有一个是不加extern的。

template <typename T> void func(T){
    
}

extern template void func<int>(int);