我目前在大学的工作是将一个C程序从MinGW(windows)移植到Visual Studio(nmake)。
我有一个非常相似的C程序的有效“makefile.vc”文件。 我的方法是将Makefile(即“makefile.vc”)用于我需要移植的程序。
除了四个C文件之外的所有文件似乎都可以正常编译这四个文件有各种错误,例如语法错误和“未知大小”。
我应该继续使用我的方法来更改Makefile还是使用CMAKE而不是nmake?
是否有关于将C程序从MinGW / gcc移植到nmake的教程或任何其他指针?
typedef struct {
A_TypeConverter *converter;
char *domain;
} enumeratorConverterEntry;
static enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */
错误:
f.c(186) : error C2133: 'enumeratorConverterEntries' : unknown size
typedef struct AsmInstructionInfo {
int flags;
CONST char **argTypes; /* line 7 */
int minArgs;
int maxArgs;
int cArgs;
} AsmInstructionInfo;
错误:
fAssemble.c(7) : error C2061: syntax error : identifier 'CONST'
...
/* file fStack.c: */
#ifdef CHECK_ACTIVATION_COUNTS
/* code */
#endif
/* more code */
void fShowStack(l_Interp *interp) { /* line 94 */
l_CallFrame *framePtr;
/* more code */
错误:
fStack.c(94) : error C2143: syntax error : missing ')' before '*'
fStack.c(94) : error C2143: syntax error : missing '{' before '*'
fStack.c(94) : error C2059: syntax error : ')'
fStack.c(94) : error C2054: expected '(' to follow 'interp'
答案 0 :(得分:1)
我刚刚用MinGW尝试了这个数组声明,它确实编译了。但是,要使其链接,需要在其他地方定义数组。结果是它看起来与extern存储类相同:
extern enumeratorConverterEntry enumeratorConverterEntries[];
我不确定使用静态存储类对原始声明是否还有其他细微之处。
答案 1 :(得分:1)
static enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */
这看起来像一个有效的不完整的数组前向声明,这将是有效的语法,除了我认为静态限定符。我没有在我面前的'C'标准的副本,但在谷歌搜索“静态数组的前向声明”结果的行之间读取似乎表明静态的不完整定义 array导致未定义的行为,因此Microsoft和GNU合法地有权使用它做任何他们想做的事情。 GNU接受它,微软拒绝它。正如Mark Wilkins所指出的那样,你应该通过将其替换为:
来使Microsoft编译器满意extern enumeratorConverterEntry enumeratorConverterEntries[]; /* line 186 */
一般来说值得注意的是,Microsoft编译器仅支持C89标准,而GNU编译器支持部分C99标准,以及它们自己的几个扩展,具体取决于编译器的参数。
fAssemble.c和fStack.c中的错误看起来像一个或多个预处理器文件丢失或不完整。您应该搜索源以找出CONST和l_Interp的定义位置,然后找出它们在发生错误的文件中没有被选中的原因。