現在開発中のGCC 4.8ではC++11の属性 (attributes)が実装されました。今まで__stdcallなどと書いていたWindows環境における呼び出し規約の指定もこの属性構文で指定できるようになることが分かりました。

#include <iostream>
 
// gnu::stdcallを指定する
[[gnu::stdcall]] int f(int x)
{
  return x;
}
 
// 関数名の後ろでも可
int g [[gnu::stdcall]](int x)
{
  return x;
}
 
// stdcall以外ももちろん対応
[[gnu::cdecl]] void f_cdecl() {}
[[gnu::fastcall]] void f_fastcall() {}
[[gnu::thiscall]] void f_thiscall() {}
 
// typedefでも使用できる。
[[gnu::stdcall]] typedef int func_type(int);
[[gnu::stdcall]] typedef int (* ptr_func_type)(int);
 
// 参考: Visual C++の構文
int __stdcall f_msvc_style(int x)
{
  return x;
}
 
int main()
{
  func_type* p = f;
  ptr_func_type p2 = f;
  func_type* p3 = g;
 
  // もちろん混ぜて使える
  func_type* p4 = f_msvc_style;
  return f(0);
}

そのからくりはこうです。GCC 4.8にC++11属性が実装されるにあたり、GCCの独自拡張__attribute__との対応も同時に実装されました (Bug 53528)。すなわち、[[gnu::hoge]]は__attribute__((hoge))の意味になります。そして、GCCでは__stdcallのほか__attribute__((stdcall))でも呼び出し規約の指定が可能でした (スポンサード リンク

この記事のカテゴリ

  • ⇒ GCCはC++属性で呼び出し規約を指定できる
  • ⇒ GCCはC++属性で呼び出し規約を指定できる