8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pragma(crt_constructor) を試してみる

Last updated at Posted at 2018-01-21

これはD言語アドベントカレンダー2017の記事です(は????)

DMD 2.078でC runtime construction and destructionが入りました ね。これはGCC拡張の __attribute__((constructor)), __attribute__((destructor)) 相当のもので、実装もそうなっているんですが、実際に同じように振る舞うのかちょっと気になりますよね。GCC拡張でよく使われている(????)テクニックを実践してみました。

1. mainの2回呼び出し

import core.stdc.stdio;

extern(C):

pragma(crt_constructor)
int main()
{
    puts("C main");
    return 0;
}
  • 実行結果
(dmd-2.078.0)$ rdmd -betterC adc1.d
C main
C main

2. mainを変数にする

import core.stdc.stdio;
import core.stdc.stdlib : exit;

extern(C):

__gshared int main = 0;

pragma(crt_constructor)
void init()
{
    printf("hello, ");
    exit(0);
}

pragma(crt_destructor)
void fini()
{
    puts("world!");
}
  • 実行結果
(dmd-2.078.0)$ rdmd -betterC adc2.d
hello, world!

'main' is usually function がでないのが悲しいですね。

できないこと

DMD限定だとsectionいじって .text にmainを置くとか __attribute__((cleanup(hoge))) みたいなのはまだ使えないです。LDCとかGDCとかだとsectionは普通にできるはず。GDCはcleanupも使えるのかな、よくわかんないです。まだすべてのトリックが使えるというわけではなですが、なんかおもしろそうな材料が増えてよかったですね。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?