我编写了以下代码来使用“21世纪C”一书中描述的匿名结构的特定的C11成语。
#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编译,如下所示:
gcc-4.9 -std=c11 -fms-extensions -lm -o c11 c11.c我还可以让它在我的OS上编译并运行macbook,但有一个警告:
cc -std=c11 -fms-extensions -lm -o c11 c11.c警告是:
c11.c:19:5: warning: anonymous structs are a Microsoft extension[-Wmicrosoft]有没有gcc或clang的版本可以编译这个文件,只使用std=c11标志而不加警告。匿名结构/联合是C11标准的一部分,只是还没有实现,还是像上面使用的那样不符合?
编辑:仅仅为了澄清上面的代码,就可以重用为基本结构编写的代码,同时可以无缝地访问包含原始结构的派生结构的所有成员。这是通过匿名结构及其相应的命名类型的联合完成的。可惜这不符合,因为我认为这是一个非常好的小成语。
发布于 2013-11-20 23:07:37
typedef struct OLHC {
union {
struct Price;
Price p;
};
double open;
} OHLC;不是C11。它是带有扩展的C语言,只允许在gcc和-fms-extensions选项中使用。
C11具有匿名结构和联合,但是:
struct Price;在您中,struct OLHC不允许作为C11匿名结构的一部分。
有没有gcc或clang的版本可以编译这个文件,只使用std=c11标志而不加警告。
不,C至少需要一个警告。
发布于 2013-11-21 10:17:51
为了添加ouah的答案,我重新编写了代码,允许只使用-std=c11标志进行编译:
#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中工作得更好。
https://stackoverflow.com/questions/20108938
复制相似问题