[英]What is the differences about struct in C99 to ANSI-C?
该代码在ANSI-C中似乎不正确,但在C99中可以:
struct a { int x; int y; } z;
C99和ANSI-C中的struct有什么区别?
编辑:我忘了“一个”,我的坏。 这段代码可以在C99模式下使用gcc正常编译,但是在夹板上是解析错误,已知它不支持所有C99扩展。
Edit2:这是夹板的输出:
Splint 3.1.2 --- 19 Dec 2007
build/ecos_install/include/cyg/fileio/fileio.h:151:5:
Parse Error. Attempting to continue.
build/ecos_install/include/cyg/fileio/fileio.h:151:25:
Cannot recover from parse error.
*** Cannot continue.
Edit3:该文件是eCos fileio.h(此片段的最后一行是第152行):
typedef CYG_ADDRWORD cyg_dir;
//=============================================================================
// Filesystem table entry
typedef int cyg_fsop_mount ( cyg_fstab_entry *fste, cyg_mtab_entry *mte );
typedef int cyg_fsop_umount ( cyg_mtab_entry *mte );
typedef int cyg_fsop_open ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
int mode, cyg_file *fte );
typedef int cyg_fsop_unlink ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int cyg_fsop_mkdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int cyg_fsop_rmdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name );
typedef int cyg_fsop_rename ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1,
cyg_dir dir2, const char *name2 );
typedef int cyg_fsop_link ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1,
cyg_dir dir2, const char *name2, int type );
typedef int cyg_fsop_opendir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
cyg_file *fte );
typedef int cyg_fsop_chdir ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
cyg_dir *dir_out );
typedef int cyg_fsop_stat ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
struct stat *buf);
typedef int cyg_fsop_getinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
int key, void *buf, int len );
typedef int cyg_fsop_setinfo ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,
int key, void *buf, int len );
struct cyg_fstab_entry
{
const char *name; // filesystem name
CYG_ADDRWORD data; // private data value
cyg_uint32 syncmode; // synchronization mode
cyg_fsop_mount *mount;
cyg_fsop_umount *umount;
cyg_fsop_open *open;
cyg_fsop_unlink *unlink;
cyg_fsop_mkdir *mkdir;
cyg_fsop_rmdir *rmdir;
cyg_fsop_rename *rename;
cyg_fsop_link *link;
cyg_fsop_opendir *opendir;
cyg_fsop_chdir *chdir;
cyg_fsop_stat *stat;
cyg_fsop_getinfo *getinfo;
cyg_fsop_setinfo *setinfo;
} CYG_HAL_TABLE_TYPE;
struct { int x; int y; } z;
自1978年以来,此代码在C的每个版本中都是有效的C,具有相同的语义,并且可能更早。 它定义了一个名为z的变量,该变量的类型为无名称结构类型,该结构类型由两个int组成。
ofaurax,您会得到什么错误消息,认为它不起作用?
(P谐的:“ ANSI C”是指由美国国家标准协会ANSI标准化的C版本。1989年版本的ANSI C标准被国际标准组织ISO采纳。1999年,ISO制定了新版本C标准,然后被ANSI采用。)
编辑:
struct a { int x; int y; } z;
这定义了一个称为“ struct a”的结构类型,该结构类型由两个int和该类型的变量z组成。 即使在1978年的C版本(“ K&R”)中,它仍然是格式正确的。 我不知道拆分是什么,但是确切的错误消息仍可能会帮助我们找出问题所在。
不太确定,但是在“旧”编译器中,我记得必须将其编写为
typedef struct _Z {int x; int y;} z; or just typedef struct {int x; int y;} z;
您可以显示实际的编译器警告,编译器标志和代码的相关行吗? 您的示例绝对没有错。 或者,也许是导致您得出结论的文档的链接?
如果您信任编译器来告诉您不同之处,那么您使用的是哪个编译器/版本?
Splint 3.1.2可以很好地解析其中仅包含该代码的文件。
您能否提供一个简单完整的示例来展示您正在描述的行为?
快速的实验表明,夹板似乎不支持混合代码和声明,这会让我无法使用它。 所以,你发表自己的代码是好的,但这样会给解析错误:
void foo () {
int x = 1;
++x;
struct a { int x; int y; } z;
}
对语法的这种更改将使它能够解析上面的简单混合代码和声明,然后它似乎可以工作,但我没有对其进行详尽的测试。
$ diff original/src/cgrammar.y src/cgrammar.y
1711a1712
> | initializer
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.