【问题标题】:Splitting up processes in different files在不同的文件中拆分进程
【发布时间】:2012-06-24 00:12:27
【问题描述】:

所以我制作了一个程序,它使用四个不同的进程来做一些事情。我工作得很好,但现在我想把它分开,这样每个进程都有自己的 .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 文件?

【问题讨论】:

    标签: c ipc multiprocessing pipe header-files


    【解决方案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
      });
    

    在 processes.h 中,然后放入

    #define GENERATE_DEFINITIONS
    

    之前

    #include "processes.h"
    

    仅在一个源文件中(例如,包含 main() 的那个)。

    【讨论】:

      【解决方案2】:

      把它放在你的 .h 中:

      extern void *functionTable;
      

      然后将其放入一个文件中,例如带有“main()”的源文件:

      #include "processes.h"
      ...
      void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2]) = {
          readProcess,
          tokenProcess,
          calculatorProcess,
          errorProcess
      };
      

      【讨论】:

      • 关闭,但不完全——头文件声明应该是extern void (*functionTable[])(int pfds[5][2]);。或者更好的是,使用typedef 作为函数指针类型。
      • 这个是在亚当斯的建议下为我做的。
      猜你喜欢
      • 2018-07-02
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多