2012-03-25 12 views
2

C99でコードを書き、GCCでコンパイルします。私は、文法上の理由から関数のオーバーロードを使用したい(そうでなければ、自分で名前を変更する必要があります)。GCC:C99でオーバーロードされた関数を許可する

私は、しかし、私はまだそれがGCCで有効にできるかどうかを疑問に思うIs there a reason that C99 doesn't support function overloading?読みました。

この時点で私を助けることができますか?

+1

簡単な回避策はなく、中にC++に存在するニーズの名前の装飾を、オーバーロードし、また、C++ではなくCの使用することです:LLVMクランで

、あなたは(オーバーロード)属性でこれを行うことができますCではC++が実際にあなたの鍵です。 –

+0

「CGG」とは何ですか?関数のオーバーロードなどの高水準言語機能が必要な場合は、おそらくC++などのより適切な言語を検討する必要があります。 –

+0

世界と私たちのマシンは、リンカを必要としないCバージョンの準備ができています!進捗。間違いなくC++の人より先に置く。 –

答えて

10

いいえ、C99に関数のオーバーロードはありません。愚かなGCC拡張ではありません。 C11には_Genericが追加されていますが、それでもあなたは自分で名前を変更する必要があります。

void foo_int(int x); 
void foo_double(double x); 

#define foo(arg) _Generic((arg), int: foo_int, double: foo_double)(arg) 

それが良いのか悪いのか。それはCです。

+0

私が探している機能に最も近い。 – shuhalo

+0

これは当てはまりません。関数のオーバーロードは "愚かな" GCC拡張で可能です。この投稿を参照してください:http://stackoverflow.com/questions/36506988/function-overloading-in-c-compiler-warnings – tjwrona1992

+0

@ tjwrona1992私はあなたが4歳のポストに正確に何かを指摘することで私にpingしてうれしい私が言及したもののように、私が追加する可能性のあるマニュアルネームのマングリングは、大金持ちのOPに言及されていますが、あなたの貴重なフィードバックに感謝します。 –

4

Cでは、マクロが他の言語の関数オーバーロードを部分的に置き換えることがあります。 Cat Plus Plusが彼女の答えで示しているように、C11には、タイプジェネリックマクロをプログラムするための追加構成体_Genericがあります。

C99では、いくつかの意味で汎用的なマクロをプログラムすることができます。 P99は、例えば、異なる数のパラメータを有するそのようなマクロを呼び出すために、その使用を容易にする機能を有する。特定のパラメータAに従って呼び出す関数を区別するために、(sizeof(A) == sizeof(float) ? sqrtf(A) : sqrt(A))のようなものを使用できます。

GCCには、そのようなことをさらに快適にプログラムできるようになりました。すなわち、({ any code here })typeofの式をマクロパラメータと同じ型の補助変数として宣言します。

+0

@CatPlusPlusはなぜ「彼女」だと思いますか? – rubenvb

+1

なぜ彼はそれが彼だと思いますか? (でも、 "猫"は女性の性別である母国語の影響をあまり受けているかもしれません。) –

+0

@JensGustedtねえ、フランス語で "cat"は男性です。あなたが女性的な形でそれを言うなら、あなたは非常に丁寧ではない何かを言うことができます... – user1284631

1

LLVM Clang3.3は関数のオーバーロードを導入しました。実際、関数のオーバーロードは期待通りに簡単ではないかもしれません。これには、関数呼び出し規約やABI(Application Binary Interface)などの問題があります。 C言語とアセンブリ言語を混在させると、これらの問題が発生することがあります。 アセンブリプロシージャを使用する場合は、エクスポートされたプロシージャの名前を多重定義しないでください。

static void __attribute__((overloadable)) MyFunc(float x) 
{ 
    puts("This is a float function"); 
} 

static int __attribute__((overloadable)) MyFunc(int x) 
{ 
    puts("This is an integer function"); 
    return x; 
} 
関連する問題