首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这段代码编译时没有错误?是不是gcc的bug?

为什么这段代码编译时没有错误?是不是gcc的bug?
EN

Stack Overflow用户
提问于 2017-09-11 15:20:14
回答 1查看 511关注 0票数 4

尽管结构中的char* name声明没有分号,但下面的代码仍被成功编译。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>

typedef struct map
{
   int id;
   char *name
}map;

int main()
{
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2017-09-11 15:52:01

我怀疑这个问题可能与C11标准有关(我没有更旧的版本,但它可能是相同的),其中指定(6.7.2.1第8段):

在结构或联合说明符中出现结构声明列表将在转换单元中声明一个新类型。struct声明列表是结构或联合的成员的声明序列。如果struct声明列表不包含任何命名成员,无论是直接还是通过匿名结构或匿名联合,行为都是未定义的。直到紧跟在终止列表的 } 之后,该类型才是不完整的,并且在之后完成。

这意味着正在执行两个操作:

列表的联合终止(类型(结构或struct-declaration-list).

  • Completion )的
  1. 终止。

我认为这可以(错误地)构造为意味着}可以通过充当终止结构声明节点的分号闭包来终止结构声明列表。

否则,有人可能会争辩说,应该只有一个操作(类型的完成),而不是两个(结构声明列表的终止+类型的完成)。

这种允许的解释(可能不反映作者的意图,IMHO)使这成为一个有问题的允许语言解释功能,而不是一个问题。

无论采用哪种方式,clanggcc的当前版本都会在缺少分号时报告(当使用c11标志时)。这显示了行为的一致性,这表明这是对标准的解释,而不是bug。

考虑到这种可能的歧义,以及声明后的}没有留下代码含义的问题,我认为编译器开发人员倾向于发出警告而不是错误绝对是合法的,并且不需要错误报告。

编辑

我阅读了John Bode的答案和Olaf的评论,并相应地编辑了我的答案,以使我的观点更加清晰。

虽然John和Olaf都比我聪明得多,虽然我从他们的角度看到了优点,但我认为在这一点上标准还不够清楚。

的确,约翰回答中的详细引用定义了每个struct-declaration都以分号(;)结束,这意味着列表应该以分号结束。

然而,同一部分中的文本解释似乎表明}可能具有双重功能。

这个建议的解释空间可能太宽松了,然而,这是在编译代码(IMHO)时引发警告而不是错误的充分理由-特别是因为代码本身不会被误解。

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

https://stackoverflow.com/questions/46159108

复制
相关文章
linux重命名文件名_linux 文件重命名
https://blog.csdn.net/weixin_33724570/article/details/91909917
全栈程序员站长
2022/09/30
4.1K0
linux重命名文件名_linux 文件重命名
linux批量文件重命名命令_shell重命名文件指令
hello_10_2016-03-17.log hello_4_2016-03-17.log hello_8_2016-03-17.log
全栈程序员站长
2022/10/02
10.7K0
在 Linux 中重命名文件夹中的所有文件
在Linux系统中,有时候我们需要批量重命名文件夹中的所有文件,以便更好地组织和管理文件。本文将详细介绍几种在Linux中重命名文件夹中所有文件的方法,包括使用命令行工具和脚本等方式。
网络技术联盟站
2023/06/08
5K0
在 Linux 中重命名文件夹中的所有文件
删除,重命名文件
重命名文件----rename #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //修改文件名 void REname(char *arr) { int ret=rename("你好世界.txt", arr); if (ret == 0) { printf("修改成功"); } else { printf("修改失败"); } } void test01() { char buf[] = "你好,世界.txt"; REname(b
大忽悠爱学习
2021/03/02
1.7K0
删除,重命名文件
java删除文件,重命名文件
在做项目时,遇到需要对文件做一些删除重命名等操作。基于java语言,保存代码段如下。
全栈程序员站长
2022/08/12
1.8K0
linux中文件重命名_如何在Linux中重命名文件?
This tutorial will walk you through the simple steps to rename a file in Linux.
全栈程序员站长
2022/09/30
8.3K0
自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Xml; using System.IO; using System.IO.Compression; u
liulun
2022/05/09
4250
自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
php案例 重命名文件
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 代码 index.php 效果: 之前的 之后的 代码 index.php <?php //重命
贵哥的编程之路
2022/09/29
1.2K0
php案例 重命名文件
EditRename文件重命名工具
一款文件重命名工具。通过在文本编辑器中直接编辑多个文件的文件名来重命名文件,非常灵活,堪比一些强大的重命名工具,但更加易用。
季春二九
2023/03/24
1.1K0
EditRename文件重命名工具
python 图片重命名_python批量重命名文件
** 一个简单的python 脚本,用于图片批量重命名,非常简单但是也非常使用!
全栈程序员站长
2022/10/03
3.5K0
python 图片重命名_python批量重命名文件
文件批量重命名
# 把当前文件夹的所有文件重命名为 WF .... # 把这个路径下的所有文件先查找到 -- 遍历所有文件 :有一个新的名字WF .. rename(旧,新) import os file_path = os.getcwd() list1 = os.listdir(file_path) print(list1) # 当前目录每个名字前面加'WF ' for name in list1: new_name = 'WF ' + name os.rename(name, new_na
汪凡
2018/05/29
1.5K0
linux 重命名 文件夹_如何给文件批量重命名
上面的例子中,子模式 \d{4} 会捕捉4个连续的数字,捕捉的四个数字匹配模式对应 $1, 将会用于新的文件名。
全栈程序员站长
2022/09/30
7K0
linux 重命名 文件夹_如何给文件批量重命名
linux重命名文件和文件夹的区别_文件夹如何重命名
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/16
4.9K0
linux 文件重命名的命令是什么_linux移动文件并重命名
大家好,又见面了,我是你们的朋友全栈君。 就目前所知道的知识,有两种方法。 一、mv
全栈程序员站长
2022/09/30
5.6K0
cmd - 批量重命名文件
相信大家或多或少都遇到过类似的情况:从网上下载了好多图片(或者其他的文件),这些图片的名字往往都是些乱七八糟的字母数字的组合们想要一次性修改几十张上百张的图片的名字应该怎么办呢?
雨临Lewis
2022/01/11
2.8K0
cmd - 批量重命名文件
在Oracle中,如何移动或重命名数据文件?
其实利用OS拷贝也可以联机操作,不关闭数据库,但是只针对可以OFFLINE的数据文件,步骤如下所示:
AiDBA宝典
2023/04/27
1.8K0
在Oracle中,如何移动或重命名数据文件?
Python对文件进行重命名
import ossrcFile = './actwork/linkFile/allExtLinks - 副本.txt'dstFile = './actwork/linkFile/allExtLinks - copy.txt'try: os.rename(srcFile,dstFile)except Exception as e: print(e) print('rename file fail\r\n')else: print('rename file success\r\n')
狼啸风云
2020/10/28
1.5K0
使用shell对文件重命名
需要把上面2018年度下面的每个子目录的文件重命名,命名规则是就是改为1.jpg到n.jpg
咪啪咪啪
2019/11/15
1.1K0
点击加载更多

相似问题

css3中精灵图像的背景转换?

25

CSS3缩放动画背景图像精灵

12

褪色图像位置

21

设置背景中精灵图像位置的大小

20

jquery图像映射-如何更改背景精灵图像位置?

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文