专栏首页BrianC语言心得一

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

相关文章

  • 深入浅出Logistic Regression之二分类

    ---- 概述 在深度学习笔记-神经网络基础文章里面介绍过Logistic Regression模型进行二分类和推导。比如:我们现在有一张彩色图片让计算机自己识...

    BrianLv
  • VPC 深入浅出解析

    概述 今天给大家介绍一下博主最近做的一个项目:VPC.VPC(Virtual Private Cloud)虚拟私有云,租户可以在云中预置一个逻辑隔离分区,自己定...

    BrianLv
  • 机器学习性能度量

    ---- 概述 我们在进行机器学习时需要衡量机器学习的优劣和本身模型的准确程度,比如简单的衡量数据的准确率和错误率,但是我们更关心的是模型的泛化能力的指标,即基...

    BrianLv
  • 黑掉美国(英国、澳大利亚、法国等)的交通控制系统

    作者 Taskiller 像电影中那样hacking ? 可能很多读者已经看过电影《虎胆龙威4:虚拟危机》,里面的“黑客恐怖分子”只需要在键盘上按几个按键就可以...

    FB客服
  • 如何在 asp.net core 3.x 的 startup.cs 文件中获取注入的服务

    从 18 年开始接触 .NET Core 开始,在私底下、工作中也开始慢慢从传统的 mvc 前后端一把梭,开始转向 web api + vue,之前自己有个半成...

    程序员宇说
  • Redis在微服务架构中的几种应用场景

    本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信、缓存或主数据库和配置服务器的三种场景应用。

    苏先生
  • 百万条数据快速查询优化技巧参考

    所以的优化并不是绝对,具体得根据业务实际情况 百万条数据快速查询优化技巧 1.应尽量避免在where子句中使用!=或<>操作符 2.应尽量避免在where子句中...

    逸鹏
  • 我们进入微服务世界的旅程-以及我们从中学到的东西。

    Our journey into the world of Microservices — and what we learned from it.

    yuanyi928
  • Colab WordCount

    iOSDevLog
  • js截屏以及three.js场景截屏

    做这个功能都是半个月之前的事情了,没想到一直耽误却一直都没有写下总结,尴尬。。。。。来来来,说正事

    acoolgiser

扫码关注云+社区

领取腾讯云代金券