1

そこで、4つの異なるプロセスを使用していくつかのことを行うプログラムを作成しました。私は完璧に動作しますが、各プロセスが独自の.cファイルを持つように分割したいと思います。すべてのプロセスの関数プロトタイプを含むヘッダーファイル「processes.h」を使用してこれを実行しようとしました。次のようになります。

#ifndef PROCESSES_H_
#define PROCESSES_H_

/*------------------------------------------------------------------------------
                definitions (defines, typedefs, ...)
------------------------------------------------------------------------------*/
#define NR_OF_PROCESSES 4

enum errCode {
    ERR_NONE = 0, ERR_SYNTAX, ERR_OPEN, ERR_TOKEN, ERR_ARG, ERR_END
};
typedef enum errCode ErrCode;

enum toktype {
    NUMBER = 0, OPERATOR, ENDOFLINE, ENDOFFILE
};
typedef enum toktype Token;


/*------------------------------------------------------------------------------
                function prototypes               
------------------------------------------------------------------------------*/
void readProcess(int pfds[5][2]);
void tokenProcess(int pfds[5][2]);
void calculatorProcess(int pfds[5][2]);
void errorProcess(int pfds[5][2]);

/*------------------------------------------------------------------------------
                global variable declarations                   
------------------------------------------------------------------------------*/
void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2]) = {
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
};


#endif /*PROCESSES_H_*/

関数#include"processes.h"の実装を含むすべての.cファイル、およびメイン関数(functionTableを使用してプロセスを設定する)にもprocesses.hが含まれます。

コンパイルしようとすると、次のエラーが発生します。

ld: duplicate symbol _functionTable in /var/folders/eH/eHF8LmdvHzSsNgT01V3jyk+++TI/-Tmp-//ccDgTW2X.o and /var/folders/eH/eHF8LmdvHzSsNgT01V3jyk+++TI/-Tmp-//ccp7zO9L.o
collect2: ld returned 1 exit status

これは、異なるファイルに分割する正しい方法ですか?または、.cファイルごとに個別の.hファイルが必要ですか?

4

2 に答える 2

0

これを行う1つの方法は、

#ifdef GENERATE_DEFINITIONS
#define EXTERN
#define INITIALIZE(x) = x
#else
#define EXTERN extern
#define INITIALIZE(x)
#endif

EXTERN void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2])
  INITIALIZE({
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
  });

プロセス.hに入れてから

#define GENERATE_DEFINITIONS

の前に

#include "processes.h"

ソースファイルの1つだけ(たとえば、main()を含むファイル)。

于 2012-06-21T17:56:02.487 に答える
0

これをあなたの.hに入れてください:

extern void *functionTable;

次に、これを1つのファイルに入れます。たとえば、「main()」を含むソースファイルです。

#include "processes.h"
...
void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2]) = {
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
};
于 2012-06-21T17:39:36.623 に答える