c语言round函数显示未定义_涨知识,C语言常见的13个问题

本文介绍了C语言中的一些常见问题,包括如何限制变量访问、标识符使用规则、初始化数组的合法性、程序崩溃原因、计算顺序的控制、表达式解析的歧义、指针类型转换的限制、浮点数相等比较的方法,以及Duff's Device等。这些问题涉及到C语言的基础和高级特性,有助于理解和解决编程中遇到的问题。
摘要由CSDN通过智能技术生成

1、如何生成 "半全局变量", 就是那种只能被部分源文件中的部分函数访问变量?

答:

这在C语言中办不到. 如果不能或不方便在一个源文件中放下所有的函数, 那么有三种的解决方案 :

(1) 为一个库或相关函数的包中所有函数的包中的所有函数和全局变量增加一个唯一的前缀, 并警告包的用户不能定义和使用文档中列出的公有符号意外的任何带有相同前缀的其它符号. (换言之,文档中没有提及的带有相同前缀的全局变量被约定为 "私有")

(2) 使用以下划线开头的名称, 因为这样的名称普通代码不能使用. (下划线开头表示"私有", 是一种约束和建议)

(3) 通过连接器操作, 例如

- piyo.cint love = 1313;- hoge.cint like_you(void) {
         extern int love;    return love + 1;          }

在链接 hoge.o 的时候, 也需要 piyo.o 确定最终"半全局变量"地址.

2、如何判断哪些标识符可以使用, 那些被保留了 ?

答:

(1) 标识符的3个属性: 作用域, 命名空间和链接类型.

[] C 语言有4种作用域(标识符声明的有效区域): 函数, 文件, 块和原型. (第4种类型仅仅存在于函数原型声明的参数列表中)

[] C 语言有4种命名空间: 行标(label, 即 goto 的目的地), 标签(tag, 结构, 联合和枚举名称), 结构联合成员, 以及标准所谓的其它"普通标识符"(函数, 变量, 类型定义名称和枚举常量). 另一个名称集(虽然标准并没有称其为"命名空间")包括了预处理宏.这些宏在编译器开始考虑上述4种命名空间之前就会被扩展.

[] 标准定义了3中"链接类型": 外部链接, 内部链接, 无链接. 对我们来说, 外部链接就是指全部变量,非静态变量和函数(在所有的源文件中有效); 内部链接就是指限于文件作用域内的静态函数和变量; 而"无链接"则是指局部变量及类型定义(typedef)名称和枚举常量.

(2) ANSI/ISO C标准标识符标准建议规则:

规则1: 所有下划线大头, 后跟一个大写字母或另一个下划线的标识符永远保留(所有的作用域, 所

有的命名空间).

规则2: 所有以下划线打头的标识符作为文件作用域的普通标识符(函数, 变量, 类型定义和枚举常量)保留(为编译器后续实现保留).

规则3: 被包含的标准头文件中的宏名称的所有用法保留.

规则4: 标准中所有具有外部链接属性的标识符(即函数名)永远保留用作外部链接标识符.

规则5: 在标准头文件中定义的类型定义和标签名称, 如果对应的头文件被包含, 则在(同一个命名空间中的)文件作用域内保留.(事实上, 标准声称"所有作用于文件作用域的标识符", 但规则4没有包含标识符只剩下类型定义和标签名称了.)

3、char a{[3]} = "abc"; 是否合法 ?

答:

也许远古时期这样的表达式是合法的, 但现在(2018-08-14)是不合法的!

> error C2143: 语法错误: 缺少“;”(在“{”的前面)> error C2143: 语法错误: 缺少“;”(在“[”的前面)> error C2109: 下标要求数组或指针类型> fatal error C1004: 发现意外的文件尾

但 char a[3] = "abc"; 是合法的. 最后的 '\0' 没有填充进去.

4、程序运行正确, 但退出却 "core dump"(核心转存)了, 怎么回事?

struct list {
         struct list * next;    char * item;}<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值