一 概述
二 类型
三 语句
四 函数
五 数据
六 内存
七 代码
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.1 作用域
作用域(scope)指符号和表达式在其中 可见 或 可被访问 的上下文。对象(包括函数)标识符有效范围由其声明位置决定。
标识符(Identifier)是用来标识实体的符号,如变量、常量、函数、类型、属性名称等。
关键字(keyword)是为编译器保留,在词法中有特殊含义的标记,不能用作标识符。
四种作用域:
- 文件 (source file)
- 块 (block)
- 函数原型 (function prototype)
- 函数 (function)
声明在任何块和函数之外,拥有文件作用域。(全局变量、函数)
声明出现在块或参数列表内,则该标识符仅在块内可见。(参数、局部变量等在特定块内有效)
声明出现在函数原型(非定义)中,仅在原型结束前可见。(如参数,仅用于提示,可省略)
函数作用域是大括号之间的区域,标签(label)是唯一有此作用域的标识符。(可 goto 到函数内任何位置)
作用域可以嵌套(nested)。内部(inner)可以访问外部(outer),反之不行。
内名标识符可以遮蔽外部同名标识符。
char *x = "abc"; int main (void) { printf("%p, %s\n", x, x); // global.x : 0x402004, abc int x = 100; printf("%p, %d\n", &x, x); // local.x : 0x7ffea1aafd70, 100 { float x = 1.0; printf("%p, %f\n", &x, x); // inner.x : 0x7ffea1aafd74, 1.000000 } printf("%p, %d\n", &x, x); // local.x : 0x7ffea1aafd70, 100 return 0; }
同一作用域内,不能以相同名称重复定义。
函数参数等同函数块变量,不能重复定义。
int main (void) { int x = 1; ^ previous definition of 'x' was here float x = 1.1; ^ error: conflicting types for 'x' return 0; }
void test(int x) { ~~~~^ previous definition of 'x' was here char x; ^ error: 'x' redeclared as different kind of symbol x = 10; }
提示:为避免混淆,小块作用域的标识符建议使用短名(如:i、x、n 等),函数内跨域的用有实际意义的单词,全局则使用多个单词组合,避免多个模块(源文件)间冲突。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论