C 和 C++:数据文件有错误 "Expected unqualified-id"

C and C++ : data file with error "Expected unqualified-id"

我想 运行 在 C++ 中编写 C 代码,在 MacOS Sierra 10.12 上使用 Xcode 8.33。我是 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];
}

当 running/compiling 时,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" },
   .
   .
   .
}

我希望能解释为什么会出现此错误,提供有关如何修复它的建议,以及必要时处理此数据文件的替代方法。谢谢!

OP在这里。根据我的问题的最后编辑,这些是我为解决问题而采取的步骤:

  1. 对于单独的文件,正如我在问题中给出的那样,错误是 Expected identifier in 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];
}