首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C89或C++ 03是否定义了严格的别名规则?

C89和C++03标准并没有明确定义严格的别名规则。然而,它们都提供了一些规则和约束来处理别名问题。

在C89标准中,别名问题主要涉及指针类型和函数类型。C89规定,如果两个指针类型或函数类型具有相同的基本类型和限定符(如const或volatile),则它们可以互相赋值。这意味着可以通过一个类型的指针来访问另一个类型的对象,但是这样的行为是不安全的,可能导致未定义的行为。

C++03标准对别名问题进行了更严格的规定。它引入了const-correctness和函数重载的概念,以确保类型的安全性。在C++03中,如果两个类型具有不同的const限定符,则它们被视为不同的类型,不能互相赋值。这样可以避免通过一个类型的指针来访问另一个类型的对象。

总的来说,虽然C89和C++03没有明确定义严格的别名规则,但它们提供了一些规则和约束来处理别名问题。在实际开发中,为了避免潜在的问题,建议遵循良好的编程实践,避免使用别名和类型转换,以确保代码的可读性和可维护性。

关于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体品牌商,无法提供相关链接。但腾讯云提供了丰富的云计算服务,包括云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++发展概述

C++从最初C with class,经历从C++98、C++ 03C++ 11、C++ 14再到C++17多次标准化改造,功能得到了极大丰富,已经演变为一门集面向过程、面向对象、函数式、泛型和元编程等多种编程范式复杂编程语言...由于C++过于复杂,并且经历长时间发展演变,目前对于C++标准支持较好主要有GNU C++和Visual C++严格来说,目前还没有一个完全支持ISO C++版本。...到了2003年,C++标准委员会总结最新技术并发布C++03标准。...从2003年到2011年,也就是从C++03到C++11,期间C++引入了对象移动、右值引用、lamba表达式(函数式编程)、编译时类型识别(auto)、别名模板以及很多新型关键词(如nullptr、decltype...C语言从1972诞生以来,先后经历K&R C、ANSI C、C89、C99和最新C11标准变更,其特性不断丰富,功能不断强大。

68510

熬夜整理万字CC++总结(一),值得收藏

如果愿意,您可以细调程序以获得最大速度最大内存使用率。 可移植性。c语言是一种可移植语言。意味着,在一个系统上编写c程序经过很少改动不经过修改就可以在其他系统上运行。...不能定义void类型变量 void test02(){ void val; //报错 } //3. void* 可以指向任何类型数据,被称为万能指针 void test03(){ int a =...,是个模具,C语言规定:通过数据类型定义变量; 数据类型大小计算(sizeof); 可以给已存在数据类型起别名typedef; 数据类型封装(void 万能类型); 2.2 变量 2.1.1 变量概念...变量定义形式: 类型 标识符, 标识符, … , 标识符 2.1.2 变量名本质 变量名本质:一段连续内存空间别名; 程序通过变量来申请和命名内存空间 int a = 0; 通过变量名访问内存空间...在解释为什么栈如此重要之前,我们先了解一下传统定义: 在经典计算机科学中,栈被定义为一个特殊容器,用户可以将数据压入栈中(入栈,push),也可以将压入栈中数据弹出(出栈,pop),但是栈容器必须遵循一条规则

43711

C++ 标准 和 C 标准 (截止到2019年03月)

C++ 标准:维基百科 Year C++ Standard Informal name 1998 ISO/IEC 14882:1998[23] C++98 2003 ISO/IEC 14882:2003...[24] C++03 2011 ISO/IEC 14882:2011[25] C++11, C++0x 2014 ISO/IEC 14882:2014[26] C++14, C++1y 2017 ISO...【C89 (ANSI C)】 随着 C 语言在多个领域推广、应用,一些新特性不断被各种编译器实现并添加进来。于是,建立一个新“无歧义、于具体平台无关 C 语言定义” 成为越来越重要事情。...【C99】 1999 年,ANSI 和 ISO 又通过了最新版本 C 语言标准和技术勘误文档,该标准被称为 C99 。这基本上是目前关于 C 语言最新、最权威定义。...现在,各种 C 编译器都提供 C89(C90) 完整支持,对 C99 还只提供部分支持,还有一部分提供对某些 K&R C 风格支持。

83810

GCC -O2 踩坑指南:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)

1、什么是别名(alias) 在 C 和 C++ 中,当多个左值 lvalue 指向同一个内存区域时,就会出现别名(alias)。...int a;float *ptr = (float *)&a;printf("%f\n", *ptr); 2、什么是严格别名 严格别名就是编译器当看到多个别名(alias)时,会在一定规则下默认它们指向不同内存区域...char 类型是严格别名规则银弹,可以作为任何类型别名。不只是 char 类型,unsigned char,uint8_t, int8_t 也满足这条规则。...4、违反严格别名规则 下面我们举几个例子,在 GCC 开启 -O2 优化时,违反严格别名规则导致定义行为。...4.1 违反严格别名规则示例 1 4.1.1 开启 GCC -O2 导致示例 1 未定义行为 #include int foo( float *f, int *i ) {

27910

嵌入式编程是否应该用C++替代C语言

嵌入式编程是否应该用C++替代C语言 1.前言 2.引进新设计模式 3.C++是一种不断更新语言 4.C++有着更加丰富特性 5.总结 1.前言 几十年来,嵌入式软件工程师们一直在争论是否应该使用...然而,C++已经逐渐普及,大约23%新嵌入式软件项目都是用C++编写。C语言发展到现在,差不多50年时间,现在正是c语言过渡到C++语言成为嵌入式开发主流语言最佳契机。...而C++则为开发人员提供真正面向对象设计模式,这种抽象模块,使得程序耦合性更低。...我们来看一下C/C++版本更迭情况: C语言版本更迭: 年份 C标准 通用名 别名 1972 Birth C - - 1978 K&R C - - 1989-1990 ISO/IEC 9899:1990...- 2018 ISO/IEC 9899:2018 C18 - C++语言版本更迭: 年份 C标准 通用名 别名 1978 - - - 1998 ISO/IEC 14882:1998 C++98 -

2K20

严格别名规则“-fstrict-aliasing”和“-fno-strict-aliasing”及类型双关

“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开...什么是严格别名规则?...gcc对严格别名定义: In particular, an object of one type is assumed never to reside at the same address as ...即,编译器假定相同内存地址绝不会存放不同类型数据,否则即破坏了严格别名规则。...下列代码,如果使用“-O2”、“-O3”“-Os”编译,并且加不“-fno-strict-aliasing”,则“*s”结果是未定义,不同编译器可能产生不同结果,即使同一编译器也可能运行时结果不尽相同

1.8K30

【一通百通】CC++std标准总结

C/C++发展很多版本标准,sunsky(本人)早就想理理std标准,让大家有个清晰了解。...某些头文件可能会注意到此宏,并且不要声明某些功能定义ISO标准不要求某些宏; 这是为了避免干扰可能使用这些名称其他任何程序。...另一方面,当指定标准GNU标准时,编译器支持所有功能都被启用,即使这些功能改变了基本标准含义。因此,一些严格程序可能会被拒绝。...总结:   目前来看,c/c++89/11是最流行,其实就是实用,有产生力。至于之前古董,只能说除了兼容性好,几乎没其他优势。   ...另外,请大家请注意下,C几乎上不再更新,慢慢转向C++统一(这话是国外c/cpp论坛),大家有空多关注C++14/17发展吧,新特性还是能振奋人心

89230

CC++ 之 C发展史及 各标准特性说明

该标准定义C语言标准和C标准库。...(以前会出错)支持 // 行注释(这个特性实际上在C89很多编译器上已经被支持)增加了新关键字restrict(C++目前并未引入), inline, _Complex, _Imaginary,...柔性数组成员在做变长报文字符串处理时极为好用,也是一个几乎所有的C码农都应该掌握技巧。 声明一个伸缩型数组成员规则:  伸缩型数组成员必须是最后一个数组成员。结构中必须至少有一个其他成员。...定义宏bool,以便兼容于C++    定义标准、可移植整型类型集合。...C89中,表达式中类型为char,short intint值可以提升为intunsigned int类型。C99中,每种整数类型都有一个级别。

85700

C++__return 0是什么意思?

return是C++定义语句,它提供终止函数执行一种方式。当return语句提供一个值时,这个值就成为函数返回值。 return语句用来结束循环,返回一个函数值。...扩展资料 总结 return是C++定义语句,它提供终止函数执行一种方式。当return语句提供一个值时,这个值就成为函数返回值....很多人甚至市面上一些书籍,都使用了void main( ) ,其实这是错误。C/C++ 中从来没有定义过void main( ) 。...下面我分别说一下 C 和 C++ 标准中对 main 函数定义。 在 C89 中,main( ) 是可以接受。Brian W. Kernighan 和 Dennis M....例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量命名规则

1.1K40

c99新功能

在ANSI标准确立后,C语言规范在一段时间内没有大变动,然而C++在自己标准化创建过程中继续发展壮大。...《标准修正案一》在1994年为C语言创建了一个新标准,但是只修正一些C89标准中细节和增加更多更广国际字符集支持。不过,这个标准引出了1999年ISO 9899:1999发表。...支持 // 开头单行注释(这个特性实际上在C89很多编译器上已经被支持) 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool 支持 long...声明时使用int a[var] 形式。不过考虑到效率和实现,不定长数组不能用在全局, struct 与 union。...修改了 / % 处理负数时定义,这样可以给出明确结果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。

36950

C语言介绍

[8] 1989年 C语言标准被批准,被称为ANSI X3.159-1989 "Programming Language C",俗称ANSI CC89标准。...7、增加了边界检查函数接口,定义安全函数,例如 fopen_s(),strcat_s() 等等。 8、增加了更多浮点处理宏。...typedef:声明类型别名。 sizeof:得到特定类型特定类型变量大小。 inline:内联函数用于取代宏定义,会在任何调用它地方展开。...[34] 14书写规则 一个说明一个语句占一行。 用{} 括起来部分,通常表示程序某一层次结构。{}一般与该结构语句第一个字母对齐,并单独占一行。...低一层次语句说明可比高一层次语句说明缩进若干格后书写。以便看起来更加清晰,增加程序可读性。在编程时应力求遵循这些规则,以养成良好编程风格。

2.5K20

Linux 内核大转变:是否将迈入现代 C++ 时代?

Peter Anvin 在邮件列表中重启关于 Linux内核C代码转换为C++讨论,并陈述自己观点。说之前先看一下这个话题历史背景。...从上面可以看出几个关键点: C++成熟性 标准C++易用性 C++14和C++20增强支持 元编程便利性 当然除了以上内容之外,还有陈述不选用Rust原因,相比Rust,C++语法更加熟悉...我们将看到LKML(Linux内核邮件列表)上这次讨论是否能够取得足够进展,以支持现代C++代码——或者至少是Linux内核中某个定义C++14~20子集——在2024年及以后。...过去,Linus Torvalds曾对C++表示强烈反感,但我们将看到是否潮水终于已经转变,他是否对最近C++标准更为满意,或者他是否仍然坚决主张将Linux内核保持在C语言中。...直到2022年,Linux内核才开始从C89过渡到C11。

13410

必备指南【C语言编程入门秘籍03

1)C语言历史: C语言发展至今已经有50多年历史,如此历史悠久语言一直不停被发展,充分说明它是最根本高级编程语言。 你学习第一门编程语言是C语言吗? 你是否了解C语言发展历史呢?...1983年,美国标准化ANSI C规范C语言语法和库函数,有助于不同编译器可移植性。 1990年,国际化ISO C标准,第一个国际标准,称为C89C90标准。...2)学习开发相关工具拓展: 目前编程入门实用vc++6.0是1998年老产品,虽然初学入门学习时推荐使用这块工具,但是要注意是这块工具只支持C89标准。...C++和C运行效率是一样,因为本质上就是C语言编程,所以很多时候学习C语言系列,我们一般都会写成学习C/C++,大多招聘公司也都这么写。...虽然现在市面上有很多学习C语言软件,但是体积小且又经典就是这款VC++6.0,它遵循C语言早期语法规则,例如需要将所有的变量在函数开头声明,否则会报错,这也提醒初学C语言朋友,需要提早声明变量

21840

C++C++入门必备知识详细讲解

,如上述代码,它输出如下图: 三、缺省参数 缺省参数是声明定义函数时为函数参数指定一个缺省值。...函数重载概念 函数重载:是函数一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数形参列表(参数个数 类型 类型顺序)不同,常用来处理实现功能类似数据类型不同问题...C++支持函数重载原理 C++支持函数重载原理是因为C++有自己函数名修饰规则。...,是函数名,所以在C语言中,重名函数名在编译过程中会有冲突,编译不通过; 但是,在C++函数名修饰规则中,C++不是用函数名汇总在一起,而是有它自己修饰规则,具体修饰规则在不同编译器有不同修饰规则...我们一一分析: 引用和指针不同点: 引用概念上定义一个变量别名,指针存储一个变量地址。

9010

Tool之双斜线注释

因为这个工程中,IDE使用编译器是gnu,编译规则默认包含了-ansi ? 从gnu手册中,可以看到-ansi等同于-std=c89,而c89那个年代,是不支持双斜线 ?...原来删除-ansi后,IDE就会将规则重置为-std=gnu89,而正是gnu89对c89做了一些扩展,其中就包含了这个双斜线注释。...不过,毕竟和c89相比,c99变化太多,编译规则改动太大,可能会涉及到代码移植兼容问题,这就需要项目经理技术负责人来统筹定制规则。...VIP中ansi选项是用单选框形式提供,那怎么修改呢? ? 直接在User Flags里填写就可以。 ? 这就是gnu编译器编译双斜线注释问题。...原来是厂家专门做改进,就像是gnu89对c89改进。 ? 看看它改进了哪些,果然有这一条 ? 好,到此为止,都搞定! 这正是: 编译工具规则多,代码注释有风格。

1.2K20
领券