2011-10-18 3 views
4

本当に必要な場合は、Cで__attribute__((weak))と指定できます(scriptedmain参照)。これにより、プログラムをAPIおよび実行可能コードとして倍にすることができ、APIをインポートしてメイン関数を上書きするコードが可能になります。モジュールのメイン関数をDプログラミング言語でオーバーライドする方法はありますか?

Dにはこれを行う方法がありますか? Pythonはif __name__=="__main__": main()を持っていますが、Cのweakの構文ははるかに近いようです。私は信じてい__attribute__((weak))

答えて

6

はい、RDMDとDMDする特別なオプションが必要なバージョンのディレクティブを使用して。

scriptedmain.d:

#!/usr/bin/env rdmd -version=scriptedmain 

module scriptedmain; 

import std.stdio; 

int meaningOfLife() { 
    return 42; 
} 

version (scriptedmain) { 
    void main(string[] args) { 
     writeln("Main: The meaning of life is ", meaningOfLife()); 
    } 
} 

test.d:

#!/usr/bin/env rdmd -version=test 

import scriptedmain; 
import std.stdio; 

version (test) { 
    void main(string[] args) { 
     writeln("Test: The meaning of life is ", meaningOfLife()); 
    } 
} 

例:

$ ./scriptedmain.d 
Main: The meaning of life is 42 
$ ./test.d 
Test: The meaning of life is 42 
$ dmd scriptedmain.d -version=scriptedmain 
$ ./scriptedmain 
Main: The meaning of life is 42 
$ dmd test.d scriptedmain.d -version=test 
$ ./test 
Test: The meaning of life is 42 

またRosettaCodeに掲載。

+2

技術的には、メインを上書きするのではなく、条件付きコンパイルを使用しています。それは '#ifdef'に近いものから' __attribute__'に近いものです。 – RedX

+0

バージョンステートメントでラップされた 'pragma(startaddress、foo)'を使って、バージョンでの主な関数をラップせずに同じ結果を得ることができます –

+0

@ratchetfreak Cool!その使用法の完全な例を挙げてください。 – mcandre

2

は弱いリンクのための特別なリンカ命令を発するGNUの拡張であるので、それは非常にツールチェーン固有です。このAFAIKのためにDMDには何もありませんが、他のDコンパイラ(GDCまたはLDC)はバックエンドの拡張をサポートしています。

0

IIRCライブラリーではなく、オブジェクトファイルにコンパイルするコードを取得する方法があります。リンカーが物を検索する方法のために、それを使って同じ効果を得ることができます。リンク順で最初に使用したいメインと一緒にターゲットを置くだけです。

関連する問題