首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面描述的匿名结构的命名引用为什么需要由clang/gcc编译的-fms-扩展?

下面描述的匿名结构的命名引用为什么需要由clang/gcc编译的-fms-扩展?
EN

Stack Overflow用户
提问于 2013-11-20 23:00:08
回答 2查看 1.4K关注 0票数 5

我编写了以下代码来使用“21世纪C”一书中描述的匿名结构的特定的C11成语

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>


typedef struct Price {
  double close;
  double high;
  double low;
} Price;

typedef struct OLHC {
  union { //union allows the dual benefits of the seamless anon. struct and code-reuse
    struct Price;  //an anonymous struct but not explicitly re-defined
    Price p;
  };
  double open;
} OHLC;


double range(Price p){  //behaviour defined for struct Price
  return(p.high - p.low);
}

double travelRange(OHLC p){  //re-uses behaviour defined for struct Price
  return (fabs(p.open - p.low) + range(p.p) + fabs(p.high - p.close));
}

int main(){
  OHLC msft={.close=33.4,  //seamless access to members
         .open=32.1,
         .high=35.5,
         .low=30.23};
  printf("Today's travel Range for MSFT was %f\n",travelRange(msft));
}

我可以让它在没有警告的情况下用gcc48或gcc49编译,如下所示:

代码语言:javascript
复制
gcc-4.9  -std=c11 -fms-extensions -lm -o c11 c11.c

我还可以让它在我的OS上编译并运行macbook,但有一个警告:

代码语言:javascript
复制
cc -std=c11 -fms-extensions -lm -o c11 c11.c

警告是:

代码语言:javascript
复制
c11.c:19:5: warning: anonymous structs are a Microsoft extension[-Wmicrosoft]

有没有gcc或clang的版本可以编译这个文件,只使用std=c11标志而不加警告。匿名结构/联合是C11标准的一部分,只是还没有实现,还是像上面使用的那样不符合?

编辑:仅仅为了澄清上面的代码,就可以重用为基本结构编写的代码,同时可以无缝地访问包含原始结构的派生结构的所有成员。这是通过匿名结构及其相应的命名类型的联合完成的。可惜这不符合,因为我认为这是一个非常好的小成语。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-20 23:07:37

代码语言:javascript
复制
typedef struct OLHC {
  union {
    struct Price;
    Price p;
  };
  double open;
} OHLC;

不是C11。它是带有扩展的C语言,只允许在gcc-fms-extensions选项中使用。

C11具有匿名结构和联合,但是:

代码语言:javascript
复制
    struct Price;

在您中,struct OLHC不允许作为C11匿名结构的一部分。

有没有gcc或clang的版本可以编译这个文件,只使用std=c11标志而不加警告。

不,C至少需要一个警告。

票数 3
EN

Stack Overflow用户

发布于 2013-11-21 10:17:51

为了添加ouah的答案,我重新编写了代码,允许只使用-std=c11标志进行编译:

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>        

typedef struct Price2 {
  double close;
  double high;
  double low;
} Price2;

typedef struct  {
  union {
    struct {  // Price2 equivalent textually re-defined within OLHC2
      double close;
      double high;
      double low;
    };
    Price2 p;
  };
  double open;
} OHLC2;


double range2(Price2 p){  //behaviour defined for struct Price2
  return(p.high - p.low);
}

double travelRange2(OHLC2 p){  //behaviour for struct Price2 re-used by OHLC2
  return (fabs(p.open - p.low) + range2(p.p) + fabs(p.high - p.close));
} 

int main(){

  OHLC2 msft2={.close=33.4,
         .open=32.1,
         .high=35.5,
         .low=30.23};
  printf("Today's travel Range for MSFT was %f\n",travelRange2(msft2));

}

关键是通过切割和粘贴基本结构定义、无标记和一切正常工作来替换导出结构中对基结构的引用。这似乎避免了的一些,即代码重用的好处,这些好处在Microsoft中工作得更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20108938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档