前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言心得一

C语言心得一

作者头像
吕海峰
发布2018-04-03 14:49:19
1K0
发布2018-04-03 14:49:19
举报
文章被收录于专栏:BrianBrian

C语言学习


C语言是一个非常灵活且高效的语言,在学习的过程中总会有很多坑。最近有一个项目是混合编程,高性能部分采用C/C++来完成,数据处理和分析采用Python来完成。Python去调用C/C++生成的动态链接库(例如:Linux是.so文件,osx是.dylib文件)。主要思想:Python进行数据处理和分析完成的“数据”抛给C/C++动态链接库,动态链接库处理业务逻辑。数据采用“推拉”(ZMQ)通信方式来传输给第三方接口,第三方的接口接到数据之后再通过kafka…。剩余的你懂得。。。。。。

作用域、链接属性和存储类型

本文只是简单的介绍一下C语言的作用域、链接属性和存储类型。写这篇博客主要是为了学习和记录自己的知识。这里简单的介绍了c语言的作用域和链接属性。

作用域

作用域的不同是体现在编译器上,大多数编译器可以确定和识别这些作用域:

  • 文件作用域
  • 函数作用域
  • 代码块作用域(位于“{}”内的代码统称为代码块)
  • 原型作用域 标识符在源代码中声明的位置,决定它本身的作用域。我们来看一下例子:
代码语言:javascript
复制
//
//  main.c
//  Test
//
//  Created by brian on 6/28/16.
//  Copyright © 2016 brian. All rights reserved.
//

#include <stdio.h>

int a=0;
int b=0;

void test2(int k)
{
    printf("kkk==%d\n",k);
}

int test(int a)
{
	 int result = a; 
    test2(a);
    return result;
    
}


int main(int argc, const char * argv[]) {
    int flag=10;
    test(flag);
    return 0;
}
  • 属于代码块作用域主要是在{}里面的都属于代码块作用域,比如(result,flag等)。
  • 文件作用域的是在所有代码块之外声明的标识符。比如:(a,b)
  • 原型作用域只是针对函数原型中声明的参数。(int a)中的a变量就是。
  • 函数作用域很少用到,它不是指函数内部作用域而是指函数作用域的语句标签。类似于:goto跳转的标签。

链接属性

c语言中标识符链接属性的设计主要是为了解决命名冲突问题,当多个源文件被编译成目标文件再链接成一个可执行文件或者链接库时,如果出现了相同的标识符如何解决?这就是链接属性的设计的用处。标识符的链接属性决定如何显示处理在不同文件中出现的标识符。虽然标识符的作用域与它的链接属性有一定的映射规律,但是他们两个是八竿子打不着的亲戚。

  • external(外部):标识符位于不同源文件中的多次声明都表示同一个实体。
  • internal(内部):在同一个源文件内的所有声明中都指同一个实体,位于不同源文件的多个声明则分别属于不同的实体。
  • none(无,没有链接属性的标识符)
代码语言:javascript
复制
typedef int *a;
int result=0;
int test(int d)
{
  int e=10;
  int test2(int g);
}

其中result,test,test2标识符都属于external,其余的标识符属性都属于none。注意a的和e的标识符属性都属于none。如果有别的源文件也声明了标识符result和test实际上访问都是这个源文件所定义的实体。关键字extern和static用于修改标识符的链接属性。在external标识符前面添加一个static关键字可以使它的链接属性变为internal。例如result,static int result = 0;这样result只属于这一个源文件。值得注意的是static只对缺省链接属性为external的声明才改变链接属性的效果。如果在e前面加入static它会起到不同的副作用,e的链接属性是none。值得注意的是一定要和变量的存储类型区分开不要混了。比如上述代码中的e,它的链接属性是external。我们再另外一个源文件中定义个result。如下代码:

代码语言:javascript
复制
//这行语句表明这两个源文件中标识符result是同一个,即使你不写也是同一个。但是这样更规范和更容易查找问题。
extern int result;

存储类型

标识符作用域和链接属性是针对编译器,而变量存储类型是针对变量值内存的存储。千万别混淆!!! 存储变量存储类型区域:

  • 内存 ==== 代码块之外声明的变量存储于静态内存中,这类变量也叫静态变量。不能指定其他存储类型。
  • 运行时堆栈 === 代码块内部声明的变量缺省类型是auto。对于代码块内部的变量如果在前面再加上static就变成了静态变量。
  • 寄存器===寄存器数量有限。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言学习
    • 作用域、链接属性和存储类型
      • 作用域
      • 链接属性
      • 存储类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档