【问题标题】:C89 initialization why does MSVC throw an error when Mingw doesn't?C89初始化为什么Mingw没有MSVC会抛出错误?
【发布时间】:2019-03-31 15:51:57
【问题描述】:

前言:我必须使用 C89,而且我知道它没有像 C99 那样指定的初始值设定项。但是,如果数组被包装在结构中,我的理解是它可以以与初始化程序相同的格式重复更改。它似乎适用于 MINGW C89。

  typedef struct fscratch{
        float contents[SIZEFDT];
    };

    int main()
    {

        fscratch fs;

        fs = (fscratch){400.0, 440.0, 480.0, 500.0, 530.0, 560.0 };     // <--MSVC error here
        memcpy(pt1->flow, fs.contents, sizeof(pt1->flow));
        fs = (fscratch){161.0, 157.0, 153.0, 150.0, 146.0, 142.0};
        memcpy(pt1->psi_disch, fs.contents, sizeof(pt1->psi_disch));

    }

Mingw C89 工作正常,没有错误, MSVC 报错:

错误 C2059:语法错误:'{' 错误 C2143:语法错误:缺少 ';' '{' 之前的错误 C2143:语法错误:缺少 ';'在'}'之前

1000 行程序的其余部分只需稍作调整即可正常工作。这条线是怎么回事?

【问题讨论】:

    标签: visual-c++ c89


    【解决方案1】:

    您必须指的是 GCC 编译器,而不是 MinGW。 MinGW是Windows的开发环境和一套库,常与GCC编译器配合使用,创建Windows程序。

    Visual Studio 也在 1990 年代中期发布。你一定是指C98吧?

    Visual Studio 和 gcc 都应该允许以下操作:

    fscratch fs = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};
    

    在旧版本的 Visual Studio 中,您只能在声明时初始化数组,而不是稍后:

    fscratch fs = { 123.0 }; //<- initialized once, okay in both gcc & VC++
    fs = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};//<- compiler error in older VC++
    

    或者你可以复制内存,这应该在编译器之间更兼容:

    #include <string.h>
    ...
    const float data1[] = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0};
    memcpy(fs.contents, data1, sizeof(data1));
    

    【讨论】:

    • 您建议的代码适用于一个 memcpy const float data1[] = { 400.0, 440.0, 480.0, 500.0, 530.0, 560.0 }; memcpy(pt1->流,data1,sizeof(data1));但是,即使它不是 const,我也无法重置 data1 以将其用于另一个 memcpy data1 = {161.0, 157.0, 153.0, 150.0, 146.0, 142.0}; memcpy(pt1->psi_disch,data1,sizeof(data1));此行将在第二次尝试时导致完全相同的错误 C2059
    • memcpy可以重复使用float data2[] = {2.0,3.0,4.0}; memcpy(fs.contents, data2, sizeof(data2));...我不建议重置data1,我说在旧的VC++中一般是不可能重置的。
    • 绝对是 GCC 中的 C89,(代码块 13.12 mingw 默认)。 MSVC 是 Visual Studio 2008。直到最近我才尝试过这么旧的 Visual Studio,但它比 2017 年、2015 年、2013 年甚至 2010 年要快得多给我留下了深刻的印象。我不会回到 2017 年,但也许2013 如果有充分的理由。所以旧的 GCC 可以用括号表示法重置浮点数组,但 2008 MSVC 不能?第一个可以的版本是什么?
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多