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==%dn",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就变成了静态变量。
- 寄存器===寄存器数量有限。
- JDK1.7新特性(4):java语言动态性之反射API
- ASP.NET Core集成现有系统认证
- Redis(2):常用命令详解
- C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?
- Ruby(3):基本语法中
- Python(3):文件读写与异常
- 向ASP.NET Core迁移
- Gitlab CI 自动部署 asp.net core web api 到Docker容器
- 从XMLHttpRequest请求响应里getResponseHeader(header)报错:Refused to get unsafe header "**" 问题解决
- 全面理解 ASP.NET Core 依赖注入
- jq实现上传头像并实时预览功能
- 初探领域驱动设计(2)Repository在DDD中的应用
- js取整并保留两位小数的方法
- 异步编程 In .NET
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VantUI封装自定义Tabbar路由跳转
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)
- jQuery实现点击添加样式同胞移除样式
- 微信小程序生命周期
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
- 微信小程序下拉刷新上拉加载
- 微信小程序引用自定义组件
- 听说Mysql你很豪横?-------------搭建MySQL MHA实现数据库高可用( MySQL MHA概述、 搭建 MySQL MHA、 MySQL MHA 故障切换)
- jQuery点击click()事件
- 大点干!早点散----------深入剖析LVS负载均衡群集原理
- javascript中元素的scrollLeft和scrollTop属性说明
- 大点干!早点散----------LVS负载均衡之LVS-NAT部署实战
- 大点干!早点散----------负载均衡LVS-DR群集部署
- 大点干!早点散----------群集负载均衡LVS DR+keepalived部署实战
- Java字符串所占字节数的小总结