A.3 C++11与C11的区别

虽然C11标准开始起草的时间比C++0x晚很多,但C11的发布却只比C++11晚了几个月。这是因为它们的草案中很多都是相互参考的。因此C++11与C11的不兼容点并不多。

下面简单地列一些C++11和C11的特别区别点。

条目1 C++11中没有C11中支持的_Generic关键字,因为C++能够很好地支持重载。

条目2 C++11中noreturn是一个通用属性。相应地要表示函数永不返回的话,在C11中可以使用_Noreturn关键字。比如:


_Noreturn void outfunc(){abort();}


是C11中的表示outfunc的方法,它等价于在C++11中使用通用属性的outfunc。


[[noreturn]]void outfunc(){abort();}


条目3 许多C11的新特性在C++11中有对应特性。只是关键字上有一些细微的区别。比如C++11中的关键字:


alignas,alignof,thread_local,static_assert


在C11中对应的关键字分别是:


_Alignas,_Alignof,_Thread_local,_Static_assert


条目4 C++11和C11都有atomic支持。

C11中用_Atomic修饰符来修饰一个原子数据类型。如:_Atomic int i;

C++11在std namespace下定义了atomic模板来支持atomic类型,比如:


template<class T>struct atomic;

template<>struct atomic<integral> ;

template<class T>struct atomic<T*>;


条目5 C11中用<threads.h>中定义的一系列用于互斥操作的函数,比如:mtx_destroy,mtx_init,mtx_lock,mtx_trylock,mtx_unlock等。

C++11中通过使用std namespace下的一些类:mutex、recursive_mutex等,通过这些类的成员函数lock、unlock、trylock支持互斥操作。

条目6 C11用<threads.h>中定义的一系列函数来支持线程,如:thrd_create,thrd_current,thrd_detach,thrd_equal,thrd_exit,thrd_join,thrd_sleep,thrd_yield。

C++11有thread类型,该类型有join、detach等成员函数。