2013-02-15 33 views
2

我一直在试图关注Zed Shaw的“Learn C the Hard Way”在线课程。我在使用Visual Studio 2010中的c编译器编译ex17时遇到了一个问题。我总是从代码的第100行左右得到一个错误。但是,当我尝试使用Ubuntu虚拟机编译完全相同的文件时,代码编译得很好。以下代码在编译器在“。”处生成错误的“{.id”处生成错误。有人可以解释为什么这个错误发生在一个编译器而不是另一个?由于它发生在Windows环境中,未来如何避免?visual studio 2010 C和Ubuntu C的结构声明区别C

void Database_create(struct Connection *conn) 
{ 
int i = 0; 

for(i = 0; i < MAX_ROWS; i++) { 
    // Make Prototype to initialize 
    struct Address addr = {.id = i, .set = 0}; //Syntax error generated here 
    // then assign it 
    conn->db->rows[i] = addr; 
     } 
} 

注意:无论C编译器开关是否被激活,都会在Visual Studio命令提示符中出现。

回答

1

struct Address addr = {.id = i, .set = 0};是一个C99构造 - 具体地说,{.id = i, .set = 0}初始值设定项是一个“指定初始化项”。

MS VC++通常不支持C99结构。在某些情况下,你可以通过编译为C++来解决这个问题,因为在C++中支持几个常见的C99功能(例如在块中的语句之后允许的声明)。但是,指定的初始化器也不是C++的一部分。

您需要使用Windows上支持C99的编译器(例如MinGW的GCC),或者修改代码以使其与C90兼容。如果没有太多的C99特定的东西,这可能不是太难:

struct Address addr = {0}; 
addr.id = i; 
+0

感谢您的答案!你摇滚! – user2073935 2013-02-15 01:30:10