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 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

发布与逸出

1183
来自专栏java学习

Java基础总结大全(1)

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

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

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

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

4258
来自专栏代码世界

Python之内置函数

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

3107
来自专栏大闲人柴毛毛

三分钟理解“模板方法模式”——设计模式轻松掌握

模板方法模式的官方定义: 在模板方法模式中,只定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定...

35610
来自专栏xiaoxi666的专栏

C++数据个数未知情况下的输入方法

我们经常需要输入一串数,而数据个数未知。这时候就不能以数据个数作为输入是否结束的判断标准了。

851
来自专栏WebDeveloper

跟我学习php字符串常用函数-下篇

1> mixed parse_url ( string $url [, int $component = -1 ] )

832
来自专栏magicsoar

C语言和go语言之间的交互 - C语言中使用go语言,使用的go语言又使用了c语言

一、go语言中使用C语言 go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import “C” 即可在go代码中使用C函数 ? 代码...

33910
来自专栏公众号文章

Golang 入门系列(二)学习Go语言需要注意的坑

上一章节我们已经了解了 Go 环境的配置,不了解的,请查看前面的文章 https://www.cnblogs.com/zhangweizhong/p/94599...

1254
来自专栏java学习

Java基础总结大全(1)

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

3515

扫码关注云+社区