extern

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

北城以北 提交于 2020-02-26 00:00:01
例子: 头文件:state.h 源文件:state.cpp 其它源文件:t1.cpp t2.cpp t3.cpp, 这些源文件都包含头文件state.h。 需要定义一个全局变量供这些源文件中使用:方法如下 1、在 state.h声明全局变量: extern inta; 2、在state.cpp中定义该全局变量:int a =10; 这样其它源文件就可以使用该变量啦 这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义: (1)声明必须使用extern关键字;(2)不能给变量赋初值 extern int a; //声明 int a; //定义 int a = 0; //定义 extern int a =0; //定义 头文件中应使用extern关键字声明全局变量(不定义),如果这个变量有多个文件用到,可以新建一个cpp,在其中定义,把这个cpp加入工程即可。 头文件请不要定义任何变量,那是非常业余的行为…… 一般在头文件中申明,用extern,在cpp中定义。 如果在头文件中定义,如果这个头文件被多个cpp引用,会造成重复定义的链接错误。 头文件只能申明全局变量(extern),不可定义(不推荐使用) .cpp里,在最外层定义即可(int gi),直接引用 如果在.cpp里使用static定义,则该变量只在当前cpp文件中有效

extern,头文件和ifndif宏

拟墨画扇 提交于 2020-02-25 23:46:35
转自:CSDN-》 fpmystar 用#include可以包含其他头文件中变量、函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数f(),我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了f()的声明)不就可以了么,为什么还要用extern呢? 这个问题一直也是似是而非的困扰着我许多年了,今天上网狠狠查了一下总算小有所获了: PS: extern可以置于变量或者 函数 前,用于高速编译器变量或者 函数 的定义在别的文件中,提示编译器遇到此变量和 函数 时在其他模块中寻找其定义。 头文件 首先说下头文件,其实 头文件对CPU而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的。 我做过一个实验,将头文件的后缀改成xxx.txt,然后在引用该头文件的地方用 #include"xxx.txt" 编译,链接都很顺利的过去了,由此可知,头文件仅仅为阅读代码作用,没其他的作用了! 不管是C还是C++,你把你的函数,变量或者结构体,类啥的放在你的.c或者.cpp文件里。然后编译成lib,dll,obj,.o等等,然后别人用的时候 最基本的gcc hisfile.cpp yourfile.o|obj|dll|lib 等等。 但对于我们程序员而言,他们怎么知道你的lib,dll..

C++编译过的C代码为什么要用extern C

。_饼干妹妹 提交于 2020-02-25 23:35:35
首先extern关键字: extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。相反,static关键字则是只能在本模块中使用。 通常,在模块的 头文件 中对本模块 提供给其它模块引用的函数和全局变量 以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C": extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的, extern "C"必须出现在函数的第一次声明上。 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int

extern \"C\" 用法解析

老子叫甜甜 提交于 2020-02-25 23:34:19
extern "c"用法解析 作者 作者Jason Ding ,链接 http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。 extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。 揭秘extern "C" 从标准头文件说起 #ifndef __INCvxWorksh /*防止该头文件被重复引用*/ #define __INCvxWorksh #ifdef __cplusplus //__cplusplus是cpp中自定义的一个宏 extern "C" { //告诉编译器



extern C

喜你入骨 提交于 2020-02-25 23:33:58
extern "C"包含双重含义,其一:被它修饰的目标是“extern”的;其二:被它修饰的目标是“C”的。 1)被extern “C”限定的函数或变量是extern类型的; extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其他模块中使用。 注意:extern int a; 仅仅是在声明一个变量,并不是定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 通常,在模块的头文件中对模块提供给其他模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只 需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错,它会在连接阶段中从模块A编译生 成的目标代码中找到此函数。 与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern "C"修饰。 2)被extern "C"修饰的变量和函数是按照C语言方式编译和连接的 作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为

extern “c”

天大地大妈咪最大 提交于 2020-02-25 23:33:19
extern "C"的双重含义 1.被它修饰的目标是“extern ”; 2.被它修饰的目标是“C ”。 让我们来详细解读这两重含义。 被extern "C"限定的函数或变量是extern类型的。 extern 是C/C++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住下列语句: extern int a; 仅仅是一个变量的声明,其并不是在定义变量a ,并未为a 分配内存空间。变量a 在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 引用一个定义在其它模块的全局变量或函数(如全局函数或变量定义在A 模块,B 欲引用)有两种方法: 1.B 模块中include 模块A 的头文件; 2.模块B 中对欲引用的模块A 的变量或函数重新声明一遍,并前加extern 关键字。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern 声明。例如,如果模块B 欲引用该模块A 中定义的全局变量和函数时只需包含模块A 的头文件即可。这样,模块B 中调用模块A 中的函数时,在编译阶段,模块B 虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A 编译生成的目标代码中找到此函数。 与extern 对应的关键字是static ,被它修饰的全局变量和函数只能在本模块中使用。因此

04、extern引用全局变量

旧巷老猫 提交于 2020-02-24 22:01:56
这里强调一点就是关extern的声明: extern在声明中最主要的作用就是告诉编译器别的文件引用了全局变量XXXX。 举例: 有一个工程名字叫 Project1。 Project1下面有两个.cpp源文件,分别为main.cpp和other.cpp other.cpp内容如下: 1 char g_char = ' A’; main.cpp内容如下: 1 #include<iostream> 2 #include<Windows.h> 3 4 using namespace std; 5 6 std::string g_str; 7 8 extern char g_char; // 告诉编译器我要引用g_char这个全局变量 9 int main(void) 10 { 11 cout << "g_char===>" << g_char << endl; 12 g_char = 'B'; 13 cout << "g_char===>" << g_char << endl; 14 system("pause"); 15 return 0; 16 } 输出结果: g_char===>A g_char===>B 来源: https://www.cnblogs.com/tito/p/12358659.html

C++中几个关键字

江枫思渺然 提交于 2020-02-18 04:50:49
volatile 编译优化时,为 提高存取速度 ,有时会把变量读取到寄存器,方便读取;但有时别的线程改变了变量的值,但寄存器值不变,造成程序读取值不一致,所以 使用volatile从变量内存中读取。 修饰某个变量,表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取,从变量的地址中(内存中)读取数据。 volatile的作用 是告知编译器,它修饰的变量随时都可能被改变。因此,编译后的程序每次在使用该变量的值时,都会从 变量的地址中读取 数据,而不是从寄存器中获取。 作用:在进行编译时不优化,在执行的时候不缓存, 每次都需要从内存中读出(保证内存的可见性) 场景:多用于多线程或多CPU编程 static和const static和const static关键字至少有下列几个作用: (1)函数体内static变量的 作用范围为该函数体 ,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的static全局变量可以被 模块内所用函数 访问,但不能被模块外其它函数访问; (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的 使用范围被限制在声明它的模块内 ; (4)在类中的static成员变量属于 整个类所拥有 ,对类的所有对象只有一份拷贝; (5

多线程cpu affinity问题

杀马特。学长 韩版系。学妹 提交于 2020-02-16 03:20:11
为了提高多线程程序的性能,有时候需要将线程绑定到固定的cpu core上。 在这个过程中一不小心就会产生编译的问题,但是明明头文件都定义了,却依然编译通不过。 不巧我就遇到了,google也基本搜不到这个问题的解决方案,没办法,只能自己解决了。 下面这个程序就会出现这种问题: [cpp] view plaincopy #include <stdio.h> #include <pthread.h> #define __USE_GNU #include <sched.h> void mybind_cpu( int cpu_id) { cpu_set_t mask; //! sched_setaffinity CPU_ZERO(&mask); CPU_SET(cpu_id, &mask); if (sched_setaffinity(0, sizeof (cpu_set_t), &mask) < 0) { printf( "Error: cpu id %d sched_setaffinity\n" , cpu_id); printf( "Warning: performance may be impacted \n" ); } return ; } void test_thread( void *cpu_id) { int cpuid = ( int )( long )cpu_id;

VC++ 全局变量定义

谁都会走 提交于 2020-02-15 11:15:54
vc定义全局变量及extern用法 : 全局变量一般这样定义: 1。在一类的.cpp中定义 int myInt; 然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。 2。在stdafx.cpp中加入: int myInt; 然后在stdafx.h中加入: extern int myInt 这样定义以后无论在什么文件中都是可见的. 来源: https://www.cnblogs.com/profession/p/12310795.html