考虑以下程序(请参见此处的现场演示)。

#include

int main(void)

{

int ;  // Missing variable name

puts("Surprise");

}

我的编译器gcc 4.8.1发出以下警告:

[Warning] useless type name in empty declaration [enabled by default]

为什么编译正常? 我应该不会出现编译器错误? 当我将其编译为C ++程序时,g ++ 4.8.1给出以下错误:

[Error] declaration does not declare anything [-fpermissive]

@Nawaz:语言规范是否明确指出?

如果编译器省略了该空声明的任何指令,它将毫无用处,Id会感到惊讶。

C ++标准明确指出:" [dcl.dcl] / 5在简单声明中,仅当声明类(第9条)或枚举(7.2)时,才可以省略可选的init-declarator-list。 ,当decl-specifier-seq包含类说明符,带有类键(9.1)的详尽类型说明符或枚举说明符时。"我不太熟悉C标准,无法引用章节。

"产生警告"不是"编译良好"。

谁想写int;并编译他的代码?我不大惊小怪。

可以省略未使用参数的名称,这会抑制未使用参数的警告。这是同一件事的局部变量等效项。我不希望它进行干净的编译,绝对值得警告。看起来像错字。

好吧,您可以同时定义多个本地(int a, b, c;),对吗? int ;看起来就像是同一件事的特例,声明了0个本地变量:D

@Luaan:...而且这种特殊情况在C和C ++中都被标准明确禁止。

用-Werror重新编译

C标准说

A declaration other than a static_assert declaration shall declare at least a declarator (other than the parameters of a function or the members of a structure or union), a tag, or the members of an enumeration.

C ++说

In a simple-declaration, the optional init-declarator-list can be omitted only when declaring a class (Clause 9) or enumeration.

违反任何一种语言都需要进行诊断。这些标准不涉及编译器错误或警告。警告是诊断。

您能否澄清该标准是否要求翻译在某些违规情况下失败? 可以将"错误"定义为会产生诊断和故障的违规行为,而"警告"则是会产生诊断且没有故障的违规行为。

@tepples不,该标准仅需要诊断。 它不需要(但允许)无效程序被拒绝。

这意味着例如 struct { int a; };声明一个struct成员,但这还不够。

@ n.m .:因此在这里需要结构名称。 对?

标签或声明符都是必需的。 标签是struct a { ... }。 声明符是struct { ...} a。 声明符可以是变量名或typedef名称(如果有typedef关键字)。

您的代码在C和C ++中都是非法的(即错误,格式错误,违反约束的代码)。在一种语言中得到"警告"而在另一种语言中得到"错误"的原因仅仅是您的编译器和编译器设置的怪癖。毕竟,两种语言都没有真正正式地区分"警告"和"错误"。在默认模式下,GCC在C模式下恰好允许(主要是出于历史原因)。

在GCC中使用-pedantic-errors,C代码中也会出现"错误"。 (请注意,-pedantic-errors并不会简单地将所有"警告"变成"错误"。它试图仅将实际违反约束的情况报告为"错误"。)

声明的语法定义为(省略init-declarator-list和init-declarator):

C11 6.7 Declarations

declaration:

declaration-specifiers init-declarator-list opt ;

static_assert-declaration

declaration-specifiers:

storage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opt

function-specifier declaration-specifiers opt

alignment-specifier declaration-specifiers opt

请注意,声明说明符是递归定义的,但是每个带有opt的声明说明符都是可选的。

另外,以下第6条规定:

The declaration specifiers consist of a sequence of specifiers that indicate the linkage,

storage duration, and part of the type of the entities that the declarators denote. The initdeclarator-list is a comma-separated sequence of declarators, each of which may have additional type information, or an initializer, or both. The declarators contain the identifiers (if any) being declared.

注意单词(如果有)。

c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?相关推荐

  1. c语言中整形变量,C语言基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  2. java中void和int的意思_c语言void和int的区别

    : 1.指代不同.int:是一种数据类型,在编程语言中,是用于定义整数类型变量的标识符.void:无类型.常用在程序编写中对定义函数的参数类型.返回值.函数中指针类型进行声明. 2.特点不同.int: ...

  3. 编译《自制编程语言 基于c语言》 郑钢 书中代码 idea

    编译<自制编程语言 基于c语言> 郑钢 书中代码 文章目录 编译<自制编程语言 基于c语言> 郑钢 书中代码 编译器 代码获取 正规途径 其他途径 运行 hello world ...

  4. C语言试题四十七之程序定义了N×M的二维数组,并在主函数中自动赋值。请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m。

    1. 题目 程序定义了N×M的二维数组,并在主函数中自动赋值.请编写函数function(int a[N][M], int m),该函数的功能是:将数组右上半三角元素中的值乘以m. 2 .温馨提示 C ...

  5. c语言比其他语言都高级,9.以下说法中正确的是( ) a.C语言比其他语言高级 b.C语言不用编译就能被计算机执行 c.C语言以接近英语国...

    选项选择c.C语言是一门通用计算机编程语言,应用广泛.从语言角度没有准确的标准说比其他语言高级. C语言要经过编译才能运行. JAVA语言比C语言更晚. 所以上面答案有C合理 C语言的设计目标是 提供 ...

  6. c语言 编译 flash,DSP-C2000 flash编程,自己定义的烧写函数在主函数中运行无法通过...

    2018-11-23 14:47:04 评论 提交评论 您好, 的确,Flash API 函数的调用必须在 RAM 中执行.对于 Flash API 函数具体的调用方法,可以参考 ControlSUI ...

  7. c 语言怎么编译 .dll,将你的 C 语言代码编译成 .NET

    介绍 通常情况下,对于那些使用C语言编程并开始用C#/ VB或一些其他的用于.NET的编译语言编程,那么他们希望或者甚至是需要调用我们用C语言编写的函数代码. 每当我在互联网上钻研,或说要在编译器中使 ...

  8. 《编译原理》实验报告——TINY语言的词法分析

    TINY语言的词法分析 实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造. 构造出的扫描器,能够读入教材样例中给出的tiny语言的示 ...

  9. c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍

    描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...

最新文章

  1. STM32如何计算RTC时钟异步预分频和同步预分频
  2. 脑电信号滤波方式汇总
  3. 使用python xmodem 模块下载及上传文件
  4. C# 7.0 新特性:本地方法
  5. 九度OJ 1434 今年暑假不AC
  6. 事件驱动数据管理 微服务和分布式数据管理问题
  7. 山石网科发布数据安全综合治理体系,覆盖数据全生命周期
  8. 《HTML5 开发实例大全》——1.9 使用 summary 标记元素实现交互
  9. 机器学习(2)---简单线性回归模型
  10. 对于局部变量_浅谈Shell函数中全局变量和局部变量
  11. 数字孪生智慧城市建设解决方案
  12. 网站一直不被收录怎么办,让网站收录更好的五个方法
  13. 机械制图及计算机绘图试题库,机械制图及计算机绘图--试题库2016版.pdf
  14. saver 保存读取
  15. C++ 已知两个时间(年月日)求日期差
  16. 电脑现在找不到驱动器,设备管理器显示DVD/CD-ROM驱动器是黄色感叹号
  17. 学大伟业:2019年数学竞赛学习经验分享
  18. HiveSqlSparkSql —— 使用left semi join做in、exists类型子查询优化
  19. 服务器上挂网站怎么挂,网站怎样上挂到云服务器
  20. linux常用命令_Linux常用命令总结

热门文章

  1. 高效能人士的七个习惯_有史以来最具影响力管理类书籍 高效能人士的七个习惯 让你成为一名成功高效的人士...
  2. gan通过python实现_python通过requests库实现爬虫(二)
  3. 静态代码块无法对静态变量赋值的原因
  4. qq浏览器网页翻译_如何通过Edge浏览器调用“谷歌翻译”,将整个网页翻译为中文...
  5. eclipse 创建springboot 提示socket time超时问题
  6. 小学计算机知识点,小学信息技术单元知识点目录介绍
  7. linux非编工作站,高清EDIUS非编网络系统建设 在线非编系统
  8. 理论应用实例水杯_PLC应用,3个PID控制实例讲解,想不会都难!
  9. Antd Mobile Design输入框组件InputItem错误显示方式封装
  10. 阿里巴巴内部开发手册