2

我一直在努力学习 Zed Shaw 的“Learn C the Hard Way”在线课程。我在尝试使用 Visual Studio 2010 中的 c 编译器编译 ex17 时遇到了一个问题。我总是从代码的第 100 行左右得到一个错误。但是,当我尝试在使用 Ubuntu 虚拟机时编译完全相同的文件时,代码编译得很好。错误在以下代码中的“{.id”处生成,其中编译器在“.”处生成错误。有人可以解释为什么这个错误发生在一个编译器而不是另一个编译器中吗?既然发生在windows环境下,以后怎么避免呢?

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 命令提示符下发生。

4

1 回答 1

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;
于 2013-02-15T00:17:45.990 回答