0

異なるヘッダー ファイルで定義された異なるデータ セットで同じ関数に使用できる 1 つのコードがあります。これらのヘッダー ファイルには、同じ変数が異なる方法で定義されている場合があります。

コードを呼び出すときにパラメーターを渡して、関数を実行するデータセットを指定できます。

私がやりたいのは、このパラメーターをコードに渡すことです。パラメーターが X に等しい場合は headerX を使用し、パラメーターが Y に等しい場合は headerY を使用します。

ヘッダー ファイルは MAIN の前にインクルードする必要があると理解しています。MAIN の後にヘッダー ファイルをインクルードして、呼び出しているヘッダー ファイルを判断する if/else ステートメントを記述できるようにすることはできますか?

それができない場合は、これを理解するのを手伝ってください。

4

3 に答える 3

1

簡単に言えば、あなたはできません。条件に応じて、事前にヘッダーを含めることができる場合があります。ファイルの先頭で#if-defブロックを使用するだけです。

ただし、他の場合のように含めることはできません。

これは間違っています

if(x == 1)
    #include "header1.h"
else
    #include "header2.h"

ただし、ファイルの先頭でこれを行うことができます。

#if SYSTEM_1
    #include "system_1.h"
#elif SYSTEM_2
    #include "system_2.h"
#elif SYSTEM_3
    #include "system_3.h"
#endif

または、オーバーロードされた関数をサポートするC++を使用することもできます。

于 2012-07-26T20:01:11.423 に答える
1

#ifdef - ブロックを使用して、コンパイルする前に使用するデータ セットを決定できます。しかし、別のデータ セットが必要な場合は、その定義を変更して実行可能ファイルを変更 (再コンパイル) する必要があります。

それ以外の場合は、ストレート C はオーバーロードされた関数をサポートしていないため、C++ でコンパイルする必要があります。

于 2012-07-26T19:49:18.277 に答える
0

マクロ前処理フェーズを使用して、単純なメタプログラミングを実行できます。次のようなもので「interface_myFunc.h」を作成します

#define FUNCNAME(T) myFunc_ ## T

void FUNCNAME(theType)(theType t);

次のような「implement_myFunc.h」ファイルを作成します

void FUNCNAME(theType)(theType t) {
 // do something with t
}

次に、このファイルを別のファイル「myFunc.h」に含めます。

#define theType toto
#include "interface_myFunc.h"
#undef theType toto

#define theType tutu
#include "interface_myFunc.h"
#undef theType tutu

定義についても同様です、「myFunc.c」

#define theType toto
#include "implement_myFunc.h"
#undef theType toto

#define theType tutu
#include "implement_myFunc.h"
#undef theType tutu

最新のC、C11には、いわゆる型ジェネリックマクロによって作成するこれらすべての関数に共通のインターフェイスを作成する方法もあります。

#define myFunc(X)              \
_Generic((X),                  \
         toto: FUNCNAME(toto), \
         tutu: FUNCNAME(tutu)  \
)(X)
于 2012-07-26T21:41:50.140 に答える