2

例:2つの.hファイルがある場合

process1.hおよびprocess2.h

また、出力変数が異なる2つの関数が含まれています。

process1.h:

function(int var)
 {
 return 2*var;
}

process2.h:

function(int var)
 {
 return 10*var;
}

これはmain.cで実行できますか?

int main()
{
int a = 2;
#include "process1.h"
printf("%d",function(a));    //output is 4

EXCLUDE #INCLUDE "process1.h" ?????    <----can this be done in any way??
#include "process2.h"
printf("%d",function(a));    //output is 20

}
4

3 に答える 3

6

いいえ、ファイルを「アンインクルード」することはできません。すべてのプリプロセッサディレクティブ(で始まる行#)は、実際のCコンパイラがソースファイルを見る前に発生していると考えてください。これらはファイルのテキストを操作するだけであり、プリプロセッサは、新しいテキストを実際のコンパイラにフィードするだけの別のステップとして実装できます。

呼び出し元に応じてのアクションを変更する最良の方法はinclude、インクルードされたファイル内でさらにマクロを使用することです。これは、インクルードする#define前に使用できます。

それでも、全体的な構文はオフであり、(通常は)Cで関数をネストすることはできません。

于 2011-11-29T10:30:59.900 に答える
3

いいえ。同じ名前の2つの関数を使用してプログラムを作成しようとしないでください。

関数が(プロトタイプだけでなく)ヘッダーファイルで実際に定義されているという特殊なケースでは、次のことができます。

#define function function_file1
#include "file1.h"
#undef function

#define function function_file2
#include "file2.h"
#undef function

int
main (void)
  {
    int a = 2;

    printf ("%d\n", function_file1 (a));
    printf ("%d\n", function_file2 (a));
  }

ただし、関数プロトタイプの名前を変更した場合、実際には実際の関数の名前を変更していないため、リンクすると未定義のシンボルエラーが発生します。

いずれにせよ、同じ名前で定義された2つの関数がある場合、ソースで他に何をしても、とにかくリンクしません。(C ++では、同じ名前で2つのものを定義できる場合がありますが、One-Definition-Ruleは、リンカーが両方とも実際には同じものであると想定し、1つだけを選択できることを意味します。)

これが、ライブラリが他の場所では使用されない名前を使用することになっている理由です。通常、すべてのシンボル名に共通のプレフィックスを追加します(例my_unique_lib_initialize())。

于 2011-11-29T11:03:14.767 に答える
0

関数ポインタの配列を使用してみませんか。確かに最初に初期化する必要がありますが、おそらくそれはあなたがやりたいことを解決すると思います。

int process1_function(int var);
int process2_function(int var);

int main(void)
{
    int i, a = 10;
    int (* functions[2])(int);

    functions[0] = process1_function;
    functions[1] = process2_function;

    for(i=0; i < 2; i++)
    {
        printf("%d", (functions[i])(a));
    }

    return 0;
}

呼び出す関数を動的に変更する必要がない場合は、関数のプレフィックスを付けることもできます。

int process1_function(int var);
int process2_function(int var);

int main(void)
{
   printf("%d",process1_function(a));
   printf("%d",process2_function(a));

   return 0;
}
于 2011-11-29T10:35:57.717 に答える