extern

【知其所以然】语义\"陷阱\"---数组和指针

佐手、 提交于 2020-02-10 03:29:33
数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过? 这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别 、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。 为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过 What's a Declaration? What's a Definition? 声明和定义 c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。 A definition is the special kind of declaration that creates an object; a declaration indicates a name that allows you to refer to an object created here or elsewhere。 定义是一种特殊的声明、它创建了一个对象;声明简单的说明了在其他地方创建的对象的名字,它允许你使用这个名字。 可以简单的这样理解: 声明 Declaration :描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方) 定义 Definition :产生一个新的对象,并分配内存。(只能出现一次) How Arrays and

MacOS下MATLAB Engine API for Python的安装

僤鯓⒐⒋嵵緔 提交于 2020-02-09 18:08:21
关键字 MacOS, MATLAB Engine, Python 2.7, Python 3.6, Permission Denied,Administrator 简介 在Mac OS X下,对Anaconda中的Python 3.6(而非Mac OS自带的Python 2.7)安装MATLAB Engine API,以实现Python对MATLAB函数的调用。 具体实现 基础方法见: https://www.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html 我采用的是上述地址中在MATLAB command promt进行操作的方法,非terminal。 MATLAB command promt中直接输入以下命令: cd ( fullfile ( matlabroot , 'extern' , 'engines' , 'python' ) ) system ( 'python setup.py install' ) ` 一开始我得到了如下报错信息: Permission denied, 意味着没有权限write到该路径。 为了修改权限,确保自己是administrator的用户(否则没有修改权限的权限),然后按照下面的方法修改写入权限(write&read):

C++中static内部链接和extern外部链接

痴心易碎 提交于 2020-02-06 05:37:31
我们在进行多文件编译时,会遇到在不同文件中存在同名变量的问题,但是相同变量存在两种情况: 1、两个文件中的同名变量实际上是相同的变量 2、两个文件中的同名变量实际上是不同的变量 对于第一种情况,实际上相同的意思是两个变量的地址也一样,就是相同的变量,但是声明在不同的文件中而已。对于这种情况,我们C++引入了 extern 关键字 extern //file1.cpp # include <iostream> using namespace std ; int count = 10 ; void printing ( ) ; int main ( ) { count ++ ; printing ( ) ; } file1.cpp 中定义了一个全局变量 count ,并且在 main 函数中进行自增运算。 //file2.cpp # include <iostream> using namespace std ; extern int count ; void printing ( ) { cout << count ; } file2.cpp 中声明了一个 外部链接 extern 同名变量,是的可以在 file2.cpp 中使用该变量,实际上这两个变量是同一个变量。 编译两个文件,输出 count 自增之后的数值! PS D:\程序\随笔程序\2020年1月 > g++ file1

const限定符

点点圈 提交于 2020-02-06 04:52:01
希望定义一个变量,它的值不能被改变,用关键词const对变量的类型加以限定: const int bufSize = 512;//输入缓存区大小 bufSize定义成一个常量,任何试图为bufSize赋值的行为都将引发错误: bufSize = 512; //错误:试图向const写值 因为const对象一旦创建后其值就不能改变,所以const对象必须初始化 const int i = get_size();//正确:运行时初始化 const int j = 42;//正确:编译时初始化 const int k;//错误:k是一个未经初始化的常量 初始化和const 在不改变const对象的操作中还有一种初始化,如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要 int i = 42; const int ci = i;//正确,i的值拷贝给了ci int j = ci;//正确:ci的值拷贝给了j 当以编译时初始化的方式定义一个const对象时,就如对bufSize的定义一样: const int bufSize = 512;//输入缓存区大小 编译器将在编译过程中把用该变量的地方都替换成对应的值,编译器会找到代码中所有用到bufSize的地方,然后用512替换。 如果程序包含多个文件,则每个用了const对象的文件都必须能访问到它的初始值才行

c++ 变量

旧街凉风 提交于 2020-02-05 19:05:52
c/c++中的变量 c++ primer这本书对变量的定义: 变量提供一个具名的,可供程序操作的存储空间。c++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间大小和布局方式,该空间可以 存储值的范围,以及变量能参与的运算。 定义(definition) 首先是 类型说明符 ,其后紧跟一个或多个 变量名(标识符)组成的列表 ,变量名之间用逗号隔开,以逗号结尾。 标识符:字母,数字,下划线组成,以字母,下划线开头 int value = 0 , i1 , i2 = 0 ; //value,i1,i2的类型均为int, // 其中value,i2的初始值为0 初始化(initialized) 当变量在创建时获得一个特定的值,变量被初始化(initialized)了。 int i = 0 ; int i = { 0 } ; int i { 0 } ; int i ( 0 ) ; //四种方式都可以实现将i初始化为0, //也有区别,在将列表初始化的时候会重点说。 需要注意的是,虽然赋值操作和初始化都是使用‘=’来操作的,但却是两个截然不同的概念,初始化不是赋值,初始化是创建变量时的操作,而赋值的含义是把对象的当前值擦除,用一个新值来代替。在c++语言中,初始化是一个复杂的问题,很多初学者都忽略了这一点,很多难以察觉的神奇bug可能就是这么出现的。 默认初始化(default

C++中字符串常用的函数

情到浓时终转凉″ 提交于 2020-02-02 03:41:14
一、字符串函数 strlen 原型:extern int strlen(char *s); 用法:#include <string.h> 功能:计算字符串s的长度 说明:返回s的长度,不包括结束符NULL。 strcmp 原型:extern int strcmp(char *s1,char * s2); 用法:#include <string.h> 功能:比较字符串s1和s2大小(ascii码值),区分大小写。 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0 strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明: src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 fabs(x) --------- 计算x的绝对值。 sqrt(x) --------- 计算x的开方。 isalpha(c) 检查字符c是否为字母。是则函数返回值为1;不是则函数返回值为0。alpha是单词“alphabet”的前5个字母。 isalnum(c) 检查字符c是否为字母或数字。是则函数返回值为1;不是则函数返回值为0

Externing functions in C++

﹥>﹥吖頭↗ 提交于 2020-02-02 02:03:06
问题 When externing a function in the cpp file does the compiler treat these differently? extern void foo(char * dataPtr); void foo(char *); extern void foo(char * ); I am wondering because I have see all these in code and not sure what the difference is. 回答1: Case by case: extern void foo(char * dataPtr); functions have external linkage by default, so the extern is not necessary - this is equivalent to: void foo(char * dataPtr); Parameter names are not significant in function declarations, so the

Externing functions in C++

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-02 02:03:04
问题 When externing a function in the cpp file does the compiler treat these differently? extern void foo(char * dataPtr); void foo(char *); extern void foo(char * ); I am wondering because I have see all these in code and not sure what the difference is. 回答1: Case by case: extern void foo(char * dataPtr); functions have external linkage by default, so the extern is not necessary - this is equivalent to: void foo(char * dataPtr); Parameter names are not significant in function declarations, so the

C++中static的含义及名字控制

谁说胖子不能爱 提交于 2020-01-30 15:13:11
C++中static的含义及名字控制 1、C/C++中,static有两层含义:在固定的地址上进行存储分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次函数调用时在堆栈上产生的。第二层含义是:对一个特定的编译单位来说是局部的。 静态对象的析构函数在main函数退出时,或是标准的C库exit()被调用时才被调用。在C++中,全局静态对象的构造函数在是main之前执行的。 2、外部连接与内部连接 一般来说,在文件作用域内的所有名字对程序中的所有翻译单元都是可见的,这就是外部连接(external linkage)。全局变量和普通函数是外部连接。 被声明为static的对象或函数的名字对翻译单元来说是局部于该单元的,这就是内部连接。如常量,内联函数,在默认情况下都是内部连接的。注意连接只引用那些在连接/装载期间有地址的成员,因此类声明和局部变量并不连接。 全局变量和静态变量存放在静态存储区。 对函数名(非成员函数),static与extern只会改变它们的可见性。 一个namespace可以在多个头文件中用一个标识符来定义。 //: C10:Header1.h #ifndef HEADER1_H #define HEADER1_H namespace MyLib { extern int x; void f(); // ... } #endif // HEADER1_H //

c/c++中extern关键字详解

試著忘記壹切 提交于 2020-01-29 17:40:53
.h作用:   头文件.h用于编写变量和函数的声明,对用户来说起到一个接口手册和说明的作用。在编译过程的预编译阶段,会将所有的#include原封不动的在原地展开。因此在利用makefile的make时候如果只是修改了.h头文件,利用make编译的时候不会进行增量编译,因为.h对应的.cpp或者.c并没有改变。需要单独删除.h对应的.o文件再进行make。 编译过程: 编译过程分为: 预编译阶段:作用:对源文件中的宏进行展开,对#include展开等等。命令:gcc -E test.c -o test.i 编译:将展开后的源文件编译成汇编文件(汇编语言)命令:gcc -S test.i -o test.s 汇编:将汇编文件编译成01机器码的.o文件  命令:as test.s -o test.o 链接:将所有的.o文件链接(链接引用库等等)成一个可执行程序.exe文件。gcc test.o test2.o -o test 编译过程示例: //lib.h int addTwo(int a, int b); //lib.c int addTwo(int a, int b) { return a+b; } //main.c #include <stdio.h> #include "lib.h" int main() { int sum = addTwo(1, 2); printf(