2

わかりましたので、プロジェクトがあり、他のさまざまなファイルで共有する必要があるヘルパー関数がいくつかあります。これを Helper.c /.h と呼び、対応するコンパイル フラグを付けて複数の包含を回避します (#ifndef SymbolName #define Symbolname blah blahblah #endif)。すべてのファイルには、次の方法でヘッダー ファイルがあります。

#include ....
#include ....
#ifndef __FILENAME_H__
  #define __FILENAME_H__ //in each file(FILENAME is replaced for the current file's name)
  declarations of functions, types, etc.
#endif

私は、dummyCompare (テンプレートと呼ばれる) と呼ばれる比較関数を持っているので、この ADT の変数を作成するときは、それが機能するように独自の関数ポインターを指定する必要があります。コンパイル時に発生するエラーは次のとおりです。

gcc ./Helper.c ./LinkedList.c ./ABB.c ./AVL.c  -Wall -lm -D DEBUG -g
duplicate symbol _dummyCompare in:
    /var/folders/f2/nghjrbz915vbhjw_1gbb65sm0000gn/T//cc75R4sQ.o
    /var/folders/f2/nghjrbz915vbhjw_1gbb65sm0000gn/T//cc8jQwyE.o
ld: 1 duplicate symbol for architecture x86_64
collect2: ld returned 1 exit status

List は、ABB(スペイン語で ABB = BST)/AVL におけるツリー操作の非再帰的なソリューションに使用されます。Sublime Text 2 を使用して、「dummyCompare」の次の検索結果を取得します。

Searching 8 files for "dummycompare"

/dir/ABB.c:
   81   if (abb != NULL) {
   82       if (ABB_getRoot(*abb) != NULL){
   83:          list = LL_newList(dummyCompare);
   84           LL_insert(list, 1, ABB_getRoot(*abb));
   85           

/dir/AVL.c:
   67   if (avl != NULL) {
   68       if (AVL_getRoot(*avl) != NULL){
   69:          list = LL_newList(dummyCompare);
   70           LL_insert(list, 1, AVL_getRoot(*avl));
   71           

/dir/Helper.c:
    2  
    3  /****************************************************************************
    4: *                                dummyCompare                                *
    5  *****************************************************************************
    6  *    Retorna si 2 dirrecciones son iguales, necesario para el funcionamiento *
    7  *    de la lista                                                             *
    8  ****************************************************************************/
    9: int dummyCompare(void * a, void * b) 
   10  {
   11   if (a == b) 

/dir/Helper.h:
    4   
    5   int getMax(int a, int b);
    6:  int dummyCompare(void * a, void * b);
    7  
    8  #endif

5 matches across 4 files

何が間違っているのか、なぜこのエラーが発生するのか理解できないようです。他の多くの質問をチェックしましたが、私が見つけた唯一の答えは、私が使用している ("use #ifndef ...") でした

4

0 に答える 0