C语言心得一

C语言学习


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

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

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

作用域

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

  • 文件作用域
  • 函数作用域
  • 代码块作用域(位于“{}”内的代码统称为代码块)
  • 原型作用域 标识符在源代码中声明的位置,决定它本身的作用域。我们来看一下例子:
//
//  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(无,没有链接属性的标识符)
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。如下代码:

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

存储类型

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

  • 内存 ==== 代码块之外声明的变量存储于静态内存中,这类变量也叫静态变量。不能指定其他存储类型。
  • 运行时堆栈 === 代码块内部声明的变量缺省类型是auto。对于代码块内部的变量如果在前面再加上static就变成了静态变量。
  • 寄存器===寄存器数量有限。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏deepcc

javascript 数据类型

29680
来自专栏程序员互动联盟

【答疑释惑】c/c++有办法加快程序进入main()前的速度吗

一、答案是Yes。 因为在执行main函数之前,程序会进行很多工作,包括调用系统API,初始化环境。 你能触及到的就是全局变量和静态变量,这些初始化工作也都在m...

32250
来自专栏搞前端的李蚊子

JS——判断一个对象是否为空

判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为“非空数组”;否则为“空数组” ?  2.通过JSO...

50080
来自专栏程序员同行者

python3模块: json & pickle

12720
来自专栏阿凯的Excel

Python读书笔记17(while与列表、字典)

今天分享利用while函数处理列表和字典,顺便温习一下历史知识 一、论如何将一个列表折腾至另外一个列表!(两个列表是独立的) 论折腾列表有几种方法! 先分...

36950
来自专栏海天一树

小朋友学Java(5):静态方法

先编写程序: class Demo { public void fun1() { System.out.println("Hello")...

29660
来自专栏java学习

Java基础总结大全(1)

一、基础知识: 1、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。 ...

37950
来自专栏北京马哥教育

Python 条件语句

文 | 糖豆 图 | 来源网络 糖豆贴心提醒,本文阅读时间3分钟,文末有秘密! Python 条件语句 Python条件语句是通过一条或多条语句的执行...

37670
来自专栏代码世界

Python之内置函数

内置函数 python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使...

33870
来自专栏数据科学与人工智能

【Python环境】Python面试题汇总(二)

【 题目:031】 | 介绍一下except的用法和作用 try/except: 捕捉由PYTHON自身或写程序过程中引发的异常并恢复 e...

28350

扫码关注云+社区

领取腾讯云代金券