extern

全局变量和extern详解

与世无争的帅哥 提交于 2019-12-07 09:07:04
声明与定义 首先讲一下声明与定义 声明不等于定义,声明只是指出了变量的名字,并没有为其分配存储空间;定义指出变量名字同时为变量分配存储空间,定义包含了声明 extern int i; //声明变量i,但没分配存储空间,还不能使用, 可以出现很多次,下面的三种情况只能出现一次 int i; //定义了变量i,并分配了空间,可以使用 extern int a =0 //定义一个全局变量a 并给初值 int a =0;//定义一个全局变量a,并给初值 注意:在程序中一个变量可以声明多次,但只能定义一次。 全局变量:在函数内部定义的变量称为局部变量,它的作用域是从定义处到函数结束;在函数外部定义的称为全局变量,它的作用域是从定义处直到文件结束。 不管是全局变量还是局部变量,作用域都是从定义处开始的 extern extern是用来声明全局变量的 #include<iostream> using namespace std; int main(){ extern int a; cout<<a<<endl; //int a=5; this is wrong , a should be a global variable getchar(); return 0; } int a=5;//global variable 用#include可以包含其他头文件中变量、函数的声明

Using “extern C” on non function call related declarations

家住魔仙堡 提交于 2019-12-07 05:23:56
问题 I know questions regarding extern "C" have been asked before but I am getting mixed signals and would like it if someone could point me to what the best practice is in the scenario below. I have written a driver for Linux and have several struct defined as well as some _IO , _IOR , and _IOW definitions for ioctl(...) calls. None of my structures contain any functions, below is an example struct , enum and ioctl that I use: #ifdef __cplusplus extern "C" { #endif enum Alignment { Left = 0,

How to declare extern typedef struct?

妖精的绣舞 提交于 2019-12-07 03:01:10
问题 I have two c files, foo.c with the functionality and test_foo.c which test the functions of foo.c. Is there a way to access the struct typedef BAR I defined in foo.c in test_foo.c without using a header file? So far, I was able to avoid a h file so that the whole program would consist of foo.c. Thanks. foo.c typedef struct BAR_{...} bar; BAR *bar_new(...) {..} test_foo.c extern BAR *bar_new(...) error: expected declaration specifiers or ‘...’ before ‘BAR’ 回答1: The answer is that there is one,

C: Is it legal to subscript an array of incomplete type?

≡放荡痞女 提交于 2019-12-07 02:28:59
问题 I can't find the relevant bits in the standard, but gcc and clang allow it, so I guess I' wondering if it's a compiler extension or part of the language. Provide a link if you can. This can arise with things such as this: extern char arr[]; func(arr[7]); /*No error.*/ LATE EDIT: I figured I'd better get a clear understanding of this, which I never did although I had moved on, so starting a bounty which I will award to the first person to give me a clear, concise reference(es) in the C89

【MySQL】show global status命令

99封情书 提交于 2019-12-06 14:34:17
原因 想通过 show global status 来完成对MySQL关键指标的采集,但是不知道这个命令频繁执行是否会造成性能压力,网上也没有搜到相关的资料。 mysql_exporter 工具也是使用的这个命令。 结论 取出值的时候可能对心痛有影响 思路 查看5.7源码 vim mysql-server-mysql-5.7.21/sql/mysqld.cc /// 从6801行开始定义了输出的性能指标结构体 /// 结构体定义可以简单理解为 /* struct st_mysql_show_var { const char *name; char *value; enum enum_mysql_show_type type; }; */ /* Variables shown by SHOW STATUS in alphabetical order */ SHOW_VAR status_vars[]= { {"Aborted_clients", (char*) &aborted_threads, SHOW_LONG, SHOW_SCOPE_GLOBAL}, #ifndef EMBEDDED_LIBRARY {"Aborted_connects", (char*) &show_aborted_connects, SHOW_FUNC, SHOW_SCOPE_GLOBAL}, #endif

[C]链接和生存周期

眉间皱痕 提交于 2019-12-06 10:20:31
链接和生存周期的区别: 链接是标识符的属性; 生存周期是对象的属性; 链接可以是外部(external),内部(internal)或没有(none); 生存周期可以是自动的、静态的,或已分配的(allocated); 链接: 一个被声明在多个翻译单元内的标识符,或者在同一个翻译单元内被声明多次的标识符,可以每次指向相同的对象或函数。如 示例4 ,具有外部链接的变量,引用的都是同一个对象; 如果该标识符具有链接,那么它和其他跟它一样具有相同链接的标识符共享一个对象或函数; 只有对象和函数标识符可以有外部或内部链接!所以一些预处理指令不能跨编译单元访问; 概念 概念 属于该状态的声明 例外 关于隐藏 外部链接 具有外部链接的标识符,表示整个程序内都是相同的函数或对象。编译器会将这种标识符交给连接器(linker),由链接器解析(resolve)这类标识符,并且把其他翻译单元和链接库中的相同标识符链接起来。 函数外部使用了不带存储修饰符的函数和对象标识符; 函数外部使用了extern存储修饰符的函数和对象标识符(事实上这是一个不规范的写法,如果你明确这个变量需要被外部引用,最好就是不带任何存储修饰符,如果必要这样做,你需要写成这样 示例3 ); 函数内部带extern的对象,而这个对象在外部具有外部链接; 如果标识符已经被声明为内部链接,在第一次声明的作用域内做第二次声明

存储持续性、作用域和链接性

荒凉一梦 提交于 2019-12-06 08:50:31
存储持续性、作用域和链接性 c++中使用3中不同的方案存储数据 c++11中使用4中不同的方案存储数据。 这些方案的区别在于数据保留在内存中的时间。 自动存储持续性 在函数定义中声明的变量的存储持续性为自动的。2种 静态存储持续性 在函数定义外定义的变量和使用关键字static定义的变量的存储持续性为静态。他们在整个程序运行过程中都存在。3种 线程存储持续性c++11 多核处理器中很常见。如果变量是使用thread_local声明的,则其生命周期和所属线程一样长。 动态存储持续性 使用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序终止为止。有时被称为自由存储或堆。 作用域和链接 作用域描述了名称在文件的多大范围可见。 作用域为局部的变量只能在定义它的代码块中用。 作用域为全局的变量在定义位置到文件结尾之间都可用。 自动变量为局部作用域。静态变量为全局作用域还是局部作用域取决于它是如何被定义的。 在函数原型作用域中使用的名称只在包含参数列表的括号内使用。 在类声明的成员的作用域为整个类。 在名称空间中的声明的变量的作用域为整个名称空间。全局作用域是名称空间作用域的特例。 c++函数的作用域为整个类或整个名称空间。但不能是局部。因为不能在代码块中定义函数。如果函数作用域为局部,则只对之间可见。不能被其他函数调用。 链接性描述了名称如何在不同单元间共享

Android JNI基础篇(一)

拥有回忆 提交于 2019-12-06 08:29:11
Android JNI 基础篇 前言 JNI学习其实并不难,在这里,我将引导大家学习JNI的基础知识,认真学完本教程,你将更加坚信我说的话。来吧,我们一起学习! JNI 基础 JNI 是什么? JNI的全称就是Java Native Interface,顾名思义,就是Java和C/C++相互通信的接口,就好比买卖房子都需要找中介一样,这里的JNI就是Java和C/C++通信的中介,一个中间人。 JNI 头文件 JNI开发前提是要引入jni.h头文件,这个文件Android NDK目录下面 示例如下: #include<jni.h> 怎么加载 so 库? Android提供了3个实用的函数用来加载JNI库,分别是System.loadLibrary(libname),Runtime.getRuntime().loadLibrary(libname),以及Runtime.getRuntime().load(libFilePath)。 用 loadLibrary 函数加载 用System.loadLibrary(libname)和Runtime.getRuntime().loadLibrary(libname)这两个函数加载so库,不需要指定so库的路径,Android会默认从系统的共享库目录里面去查找,Android的共享库目录就是vendor/lib和system/lib

C内联函数的内外链接的区别

微笑、不失礼 提交于 2019-12-06 05:43:57
C内联函数简介 inline提示编译器做可选优化,这就要求编译器能见到内联函数的定义(一般通过头文件引入编译单元),也就引入本节要讨论的焦点:内联函数外链接. 内联函数根据是否跟static修饰,分为内链接和外链接;顾名思义内链接仅在当前编译单元有效,若通过头文件引入其它编译单元,相当于一份同名拷贝,各自在不同编译单元有效,但这可能增大了二进制文件的体积(内联失败就带有多份静态函数的拷贝);外链接与之相反,它共享同一份代码. C内联函数使用 内联函数内链接 内联函数的内链接如: inline static void fn(void) {} 没有任何限制,使用简单,建议采用. 内联函数外链接 内联函数的外链接如: inline void fn(void) {} 则有诸多限制.如下: 一个非 static 的内联函数不能定义一个非 const 的函数局部 static 对象,并且不能使用文件作用域的 static 对象. static int x; inline void f(void) { static int n = 1; // 错误:非 const 的 static 对象在非 static 的 inline 函数中 int k = x; // 错误:非 static 的 inline 函数访问 static 变量 } 内联函数的外链接允许同名的外部函数,且在调用时行为是未指定的

iOS 不要用宏来定义你的常量

巧了我就是萌 提交于 2019-12-06 03:23:38
首先,预处理命令他不是一个常量!!!! 我们来看一段代码 #define avatar @"60" if (false) { #define avatar @"80" } NSLog(avatar); 这段代码会输出多少,我们将“avatar”定义为了60,然后在一个永远不会执行的代码里面重新定义了“avatar”为80,if语句中的代码 永远不会执行,但是在编译时期,编译器会编译这段代码,而这个时候编译器就会将avatar这个名字替换为@“80”,所以这段代码最后的输出结果就是 80。 当然这个时候编译器是会有一个警告的,但是不知道有多少同学会忽略这个警告。或者你会告诉我你对警告十分敏感,不会放过他的,但是记住你不是一个人在写代码,可能在别人的页面他给你重新定义了你的define,给你挖了一个大坑,还找不着……… 用const来定义一个常量 const修饰符定义的变量是不可变的,比如说你需要定义一个动画时间的常量,你可以这么做: static const NSTimeInterval kAnimateDuration = 0.3; 当你试图去修改“ kAnimateDuration”的值的时候,编译器会报错。更加重要的是用这种方法定义的常量是带有类型信息的,而这点则是define不具备的。 也许你已经发现了,如果你像这样定义: static const NSString *