C和C ++:具有错误"预期不合格的ID"的数据文件[英] C and C++ : data file with error "Expected unqualified-id"

本文是小编为大家收集整理的关于C和C ++:具有错误"预期不合格的ID"的数据文件的处理方法,想解了C和C ++:具有错误"预期不合格的ID"的数据文件的问题怎么解决?C和C ++:具有错误"预期不合格的ID"的数据文件问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想在MacOS Sierra 10.12上使用XCode 8.33在C ++中运行C代码.我是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" },
   .
   .
   .
}

我将感谢关于为什么发生此错误的解释,有关如何修复该错误的建议以及在处理此数据文件的必要替代方案.谢谢!

推荐答案

OP在这里.这些是根据我的问题的最后编辑来解决问题的步骤:

  1. 在我的问题中给出的单独文件时,错误是mscmix_dat.c中的Expected identifier.
  2. per @lightnessracesinorbit的建议,我通过实际替换#include thisfile.c来巩固多个main.cpp,msclib.h,msclib.h,msclib.c和mscmix_dat.c files:main.cpp和msclib.c.文件代码内容.我还通过简单重命名将msclib.c更改为.cpp.这消除了Expected identifier的原始错误,但出现了新的错误.
  3. 编译两个文件在msclib.cpp中给出了多个错误,所有WRT变量类型转换.
  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];
}

本文地址:https://www.itbaoku.cn/post/1794080.html

相关标签/搜索