C и C++: файл данных с ошибкой "Ожидаемый неквалифицированный идентификатор"

Я хотел бы запустить код C в C++, используя Xcode 8.33 на MacOS Sierra 10.12. Я новичок в C/C++, компиляторах и т.д., поэтому, пожалуйста, потерпите меня. Код C, когда скомпилирован и запущен с make через Терминал, работает. Но когда я добавляю все те же файлы в проект XCode C++, возникает ошибка с файлом данных. Примечание: я изменил main.c в main.cpp,

//**** main.cpp *****

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>

extern "C" {
#include "msclib.h"
}

int main(int argc, char** argv)
{
    assert(argc >= 1);
    return msc_get_no(argv[1]);

}

Файл msclib.c вызывает файл данных mscmix_dat.c, Вот также msclib.h

// ***** msclib.h *****

extern size_t msc_get_no(const char*); 

// ***** msclib.c *****

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>

#include "msclib.h"

struct msc_data
{
   const char* code;
   const char* desc;
};

typedef struct msc_data MSCDat;

static const MSCDat mscdat[] =
#include "mscmix_dat.c"
   ;

static const size_t msccnt = sizeof(mscdat) / sizeof(mscdat[0]);

static int msc_cmp(const void* a, const void* b)
{
   const char*   msc_code = a;
   const MSCDat* p        = b;   
   return strcmp(msc_code, p->code);
}

size_t msc_get_no(const char* msc_code)
{
   assert(NULL != msc_code);
   assert(strlen(msc_code) == 5);

   MSCDat* p = bsearch(msc_code, &mscdat[0], msccnt, sizeof(mscdat[0]), msc_cmp);

   if (NULL == p)
   {
      fprintf(stderr, "MSC \"%s\" not valid\n", msc_code);
      return 0;
   }

   assert(NULL != p);
   return p - &mscdat[0];
}

При запуске / компиляции mscmix_dat.c файл получает ошибку Expected identifier or ( - это то, что мне нужно помочь. Даже когда я заменяю mscmix_dat.c с .cpp Я получаю ошибку Expected unqualified-id

// ***** mscmix_dat.c *****
{ //<-- Xcode highlights this line and gives the error
   { "*****", "Error" },
   { "00-01", "Instructional exposition (textbooks, tutorial papers, etc.)" },
   { "00-02", "Research exposition (monographs, survey articles)" },
   { "00A05", "General mathematics" },
   .
   .
   .
}

Буду признателен за объяснения того, почему эта ошибка возникает, предложения о том, как ее исправить, и, если необходимо, альтернативы обработке этого файла данных. Спасибо!

1 ответ

Решение

ОП здесь. Вот шаги, которые я предпринял, чтобы решить мою проблему, основываясь на последнем редактировании моего вопроса:

  1. С отдельными файлами, как указано в моем вопросе, ошибка была Expected identifier в mscmix_dat.c,
  2. По предложению @LightnessRacesinOrbit я объединил несколько файлов main.cpp, msclib.h, msclib.c и mscmix_dat.c в два файла: main.cpp и msclib.c, заменив #include thisfile.c с фактическим содержанием кода файла. Я также изменил msclib.c на.cpp с помощью простого переименования. Это устранило первоначальную ошибку Expected identifier, но возник новый.
  3. Компиляция двух файлов дала несколько ошибок в msclib.cppвсе преобразования типов переменных.
  4. Из-за отличий C++ от C я решил проблему преобразования типов с помощью приведения, но также const,

Ниже мой последний, успешно скомпилированный код.

// **** main.cpp ****
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <ctype.h>

#include<string>
#include<iostream>
using namespace std;

extern size_t msc_get_no(const char*);

int main(int argc, char** argv)
{
    assert(argc >= 0);
    return (int)msc_get_no(argv[1]); // casting

}

// **** msclib.cpp ****
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <ctype.h>

extern size_t msc_get_no(const char*);

struct msc_data
{
   const char* code;
   const char* desc;
};

typedef struct msc_data MSCDat;

static const MSCDat mscdat[] =
{
    { "*****", "Error" },
    { "00-01", "Instructional exposition (textbooks, tutorial papers, etc.)" },
    { "00-02", "Research exposition (monographs, survey articles)" },
    { "00A05", "General mathematics" }
}
   ;

static const size_t msccnt = sizeof(mscdat) / sizeof(mscdat[0]);

static int msc_cmp(const void* a, const void* b)
{
   const char*   msc_code = static_cast<const char*>(a); //<----
   const MSCDat* p        = static_cast<const MSCDat*>(b); // (const MSCDat*)b also works
   return strcmp(msc_code, p->code);
}


size_t msc_get_no(const char* msc_code)
{
   assert(NULL != msc_code);
   assert(strlen(msc_code) == 5);

    MSCDat* p; // changed initialization of p
   p = (MSCDat*) bsearch(msc_code, &mscdat[0], msccnt, sizeof(mscdat[0]), msc_cmp);

   if (NULL == p)
   {
      fprintf(stderr, "MSC \"%s\" not valid\n", msc_code);
      return 0;
   }

   assert(NULL != p);
   return p - &mscdat[0];
}
Другие вопросы по тегам