问题描述
我想在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在这里.这些是根据我的问题的最后编辑来解决问题的步骤:
- 在我的问题中给出的单独文件时,错误是mscmix_dat.c中的Expected identifier.
- 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的原始错误,但出现了新的错误.
- 编译两个文件在msclib.cpp中给出了多个错误,所有WRT变量类型转换.
- 由于与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]; }