GCC 5の変更点
GCC 5の変更点で興味深い部分を紹介してみる。
まず、C言語のデフォルトが-std=gnu11になったことだ。C11にGCC拡張を付け加えたものがデフォルトとなる。
__has_includeと__has_attributeのサポート
__has_includeは、ヘッダーファイルがあるかどうかを確認できるプロプロセッサーの定数式の中で使える特殊な式で、特定のヘッダーファイルがあるかどうかを確認するのに使える特殊なマクロのように振る舞う。
// __has_includeが存在するか確認
#ifdef __has_include
// <optional>が存在するかどうか確認
# if __has_include(<optional>)
# include <optional>
# else
# define NO_OPTIONAL_HEADER 1
# endif
#endif
__has_attributeは、属性名に対して同様に働く。
#ifdef __has_attribute
# if __has_attribute(__noinline__)
# define ATTRIBUTE [[__noinline__]]
# else
# define ATTRIBUTE
# endif
#endif
この機能は、C++のSD-6: SG10 Feature Test Recommendationsの実装だ。同時に、この提案のマクロも定義されている。
__builtin_add_overflow, __builtin_sub_overflow, __builtin_mul_overflowの追加
オーバーフローしたかどうかを返す。
void plus( unsigned int x, unsigned int y )
{
unsigned int result ;
if ( __builtin_add_overflow( x, y, &result ) )
{
// オーバーフローした
}
else
{
// オーバーフローしなかった
}
}
3つの引数を取り、ひとつ目とふたつ目の引数を加算、減算、乗算したあと、結果をポインターとして取った3つめの引数に書き込む。また、戻り値として、オーバーフローしなかった場合はfalse, オーバーフローした場合はtrueを返す。
変数テンプレートのサポート
template < typename T, typename U >
constexpr bool is_same_v = std::is_same<T, U>::value ;
constexpr bool b = is_same_v<int, int> ; //
変数テンプレートは、変数宣言をテンプレートにできるC++14の新機能だ。
テンプレートテンプレートパラメーターにおけるtypenameキーワードの許可
template <
template < typename T >
typename U >
struct S ;
C++17に入った機能だ。
アグリゲート初期化と非staticデータメンバー初期化子の併用ができるようになった。
struct S { int x ; int y = 2 ; } ;
S s = { 1 } ; s.x == 1, x.y == 2
C++14のconstexprの制限緩和に対応。変数の宣言、変更、if分やループが書けるようになった。これにより、constexpr関数が普通に書けるようになった。
constexpr unsigned int f( unsigned int x )
{
int temp = 0 ;
for ( ; x != 0 ; --x )
{
++temp ;
}
return temp ;
}
C++14のサイズ付き解放関数に対応。
void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;
C++の最新の規格準拠のために、C++ライブラリのABIに非互換な変更が加えられた。新しいABIがデフォルトになる。
ドワンゴ広告
今日は有給を取ったので仕事が休みだ。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0