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在这里。根据我的问题的最后编辑,这些是我为解决问题而采取的步骤:
- 对于单独的文件,正如我在问题中给出的那样,错误是
Expected identifier
in mscmix_dat.c
。
- 根据@LightnessRacesinOrbit 的建议,我将多个 main.cpp、msclib.h、msclib.c 和 mscmix_dat.c 文件合并为两个文件:main.cpp 和 msclib.c,将
#include thisfile.c
替换为实际的文件代码内容。我还通过简单重命名将 msclib.c 更改为 .cpp。这消除了 Expected identifier
的原始错误,但出现了一个新的错误。
- 编译这两个文件在
msclib.cpp
中出现了多个错误,都是关于变量类型转换的。
- 由于 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];
}
我想 运行 在 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在这里。根据我的问题的最后编辑,这些是我为解决问题而采取的步骤:
- 对于单独的文件,正如我在问题中给出的那样,错误是
Expected identifier
inmscmix_dat.c
。 - 根据@LightnessRacesinOrbit 的建议,我将多个 main.cpp、msclib.h、msclib.c 和 mscmix_dat.c 文件合并为两个文件:main.cpp 和 msclib.c,将
#include thisfile.c
替换为实际的文件代码内容。我还通过简单重命名将 msclib.c 更改为 .cpp。这消除了Expected identifier
的原始错误,但出现了一个新的错误。 - 编译这两个文件在
msclib.cpp
中出现了多个错误,都是关于变量类型转换的。 - 由于 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];
}