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;
}
c语言中标识符链接属性的设计主要是为了解决命名冲突问题,当多个源文件被编译成目标文件再链接成一个可执行文件或者链接库时,如果出现了相同的标识符如何解决?这就是链接属性的设计的用处。标识符的链接属性决定如何显示处理在不同文件中出现的标识符。虽然标识符的作用域与它的链接属性有一定的映射规律,但是他们两个是八竿子打不着的亲戚。
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;
标识符作用域和链接属性是针对编译器,而变量存储类型是针对变量值内存的存储。千万别混淆!!! 存储变量存储类型区域: