extern

extern关键字

妖精的绣舞 提交于 2020-03-03 06:32:51
1、extern用于两个或多个文件 共享相同的全局变量或者函数 。对于所有的程序文件是可用的。 2、而且当使用extern时可以 找到已经定义的变量或函数的引用 。\ 第一个文件: int count ; int main(){ count=5; } 第二个文件: extern int count ; void func(){ cout <<"count is "<<count<<endl; } 结果是 count is 5; 来源: CSDN 作者: try_again_later 链接: https://blog.csdn.net/try_again_later/article/details/104620376

C++ Primer Plus(九)——内存模型和名称空间

你说的曾经没有我的故事 提交于 2020-03-02 03:24:14
程序分成三部分: 头文件:包含结构声明和使用这些结构的函数的原型,使用#define或const定义的符号常量,类声明,模板声明,内联函数 只需将源代码文件加入项目中,而不用加入头文件;不要使用#include来包含源代码文件,这样将导致多重声明。 同一个文件中只能将同一个头文件包含一次,可以使用以下的防护方案。基于预处理器编译命令#ifndef,可以在没有使用#define定义某个特定名称时,处理#ifndef和#endif之间的语句。但这种方法并不能防止编译器将文件包含两次,而只是让他忽略除第一次外的所有内容。 源代码文件:包含与结构相关的函数的代码 源代码文件:包含调用与结构相关的函数的代码 C++标准允许每个编译器以他认为合适的方式实现名称修饰,因此不同编译器创建的对象代码文件很可能无法正确的连接。请确保所有对象文件都是由同一个编译器生成的。 C++的存储连续性:自动存储连续性、静态存储连续性、线程存储连续性、动态存储连续性 在C++11中,关键字auto用于自动类型判断,但在C语言和以前的C++版本中,auto的含义截然不同,它被用于显式指出变量为自动存储。在C++11中,这种用法不再合法。 在C++11前,关键字register用于建议编译器使用CPU寄存器来存储自动变量。在C++11中,关键字register这种提示作用失去,只用于显式指出变量是自动的。

TabControl控件的美化

和自甴很熟 提交于 2020-03-01 05:57:26
最近因项目需要 所以就到网上找了一个美化过的TabControl控件 只不过这个控件没有实现TabPage的关闭功能 所以就自己添加了一个关闭功能 好了废话不多说 直接贴代码 UpDownButtonPaintEventArgs 类的代码 UpDownButtonPaintEventArgs 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Windows.Forms; 5 using System.Drawing; 6 7 namespace StyleWinForm.TabControls 8 { 9 public delegate void UpDownButtonPaintEventHandler(10 object sender,11 UpDownButtonPaintEventArgs e);12 13 public class UpDownButtonPaintEventArgs : PaintEventArgs14 {15 private bool _mouseOver;16 private bool _mousePress;17 private bool _mouseInUpButton;18 19 public

c/c++ extern 和extern "c"

混江龙づ霸主 提交于 2020-02-28 18:59:23
extern (c语言关键字):它告诉编译器,其使用的变量或者函数已经在其他模块定义了。(c语言的模块通常指文件范围) 举个例子: a.c文件 int j; 那么在b.c里面可以 extern int j;来使用a.c里面的int j。 当然可以在在a.c里面定义 static int j。通过添加static来限定int 只能在当前文件使用。 extern "c" (c++的关键字):主要用于c和c++的混合编程。他告诉编译器,被它包含的代码以c语言的方式编译和连接(c语言和c++对函数的编译会生成不同格式的名字)。使用例子如下 c++使用c代码: /* c语言头文件:cExample.h */ #ifndef C_EXAMPLE_H #define C_EXAMPLE_H int add(int x, inty); #endif /* c语言实现文件:cExample.c */ #include "cExample.h" int add( int x, int y ) { return x + y; } // c++实现文件,调用add:cppFile.cpp extern"C" //以c语言的方式编译和连接包含的代码 { #include"cExample.h" } int main(int argc, char* argv[]) { add(2,3); return0; }

C/C++中全局变量的那些事儿

牧云@^-^@ 提交于 2020-02-28 06:40:52
  C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《 C/C++中静态局部变量的特点与应用 》中我们介绍过静态局部变量,今天我们的目标是全局变量。 单个文件中的全局变量   简单一点说, 全局变量就是在函数外面定义的变量 ,下面是一个最简单的实例,一共定义了两个int型的全局变量a和b,这两个全局变量定义的位置不大相同,a定义在函数fun1之前,而b定义在之后,a和b都定义在函数main之前,从使用情况看全局变量a可以在其后面的所有函数中使用,而全局变量b只能在函数main中使用,不能在其定义之前的函数fun1中使用。因此,我们可以得出这样的结论: 全局变量的作用域为其定义位置开始,至文件结尾,也即只有 文件作用域 。 C++语言 : 知蚁博客 #include “stdio.h” int a = 1 ; //这就是个全局变量啦 void fun1 () //这个函数只能使用全局变量a,不能用b { a ++ ; printf ( “a=%d \n “ , a ); } int b = 2 ; //这也是个全局变量 void main () //这里a b都可以用 { fun1 (); a ++ ; printf ( “a=%d,b=%d \n “ , a , b); getchar (); } 让全局变量在多个文件中有效   前面讲过

学点 C 语言(34): 函数 - 关于变量(auto、static、register、extern、volatile、restrict)

妖精的绣舞 提交于 2020-02-28 06:16:43
1. 局部变量: 局部变量也叫自动变量, 它声明在函数开始, 生存于栈, 它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是 auto; 因可以省略, 几乎没人使用 */ printf("%d\n", i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外, 一般应在函数前; 每个函数都可以使用它, 不过全局变量应尽量少用. #include <stdio.h> void add(void); void mul(void); int gi = 3; /* 全局变量 */ int main(void) { printf("%d\n", gi); /* 3 */ add(); printf("%d\n", gi); /* 5 */ mul(); printf("%d\n", gi); /* 10 */ getchar(); return 0; } void add(void) { gi += 2; } void mul(void) { gi *= 2; } 全局变量会被初始化为空, 而局部变量在没有赋值前是一个垃圾值: #include <stdio.h> int gi; /* 全局变量 */ int main(void) { int

c++进阶十三(内存管理)

两盒软妹~` 提交于 2020-02-28 00:49:30
c++三种管理内存的方式: 一. 自动存储(栈存储) 函数的形参,函数内部声明的变量及结构体变量自动存储在栈里面 在所属函数被调用时自动产生,在函数结束时自动消亡 二. 静态存储(编译器预分配) 每个程序都分配一段静态内存空间,永久存储,在程序开始时建立,程序运行结束时销毁static extern变量。 1,extern关键字 为全局变量(外部变量),在函数和类外部定义,可以在程序任一位置进行访问 1.1 定义性声明 extern 类型 变量名 =初始化表达式 extern double a=1.11; 1.2 引用性声明 extern 类型 变量名; # include <iostream> using namespace std ; void change ( ) ; int main ( ) { //引用性定义extern变量 extern int num ; //调用一次change函数 cout << num << endl ; change ( ) ; cout << num << endl ; } //声明num int num = 0 ; void change ( ) { num + = 3 ; } 三. 动态存储 new 和delete,在*或者堆(heap); malloc 和free 自由存储空间(free store) 相比于栈

C# 通过服务启动窗体(把窗体添加到服务里)实现用户交互的windows服务[转发]

[亡魂溺海] 提交于 2020-02-27 12:35:45
由于个人需要,想找一个键盘记录的程序,从网上下载了很多,多数都是需要注册的,另外也多被杀软查杀。于是决定自己写一个,如果作为一个windows应用程序,可以实现抓取键盘的记录。想要实现随系统启动的话,其中一种方法就是要作为windows服务,把代码直接写到服务里边并不能抓取到键盘的记录,从网上翻阅资料及查看msdn才知道: Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行。窗口区域是包含剪贴板、一组全局原子和一组桌面对象的安全对象。由于 Windows 服务的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应。同样,错误信息应记录在 Windows 事件日志中,而不是在用户界面中引发。 服务程序一般使用的是LocalSystem帐户,拥有自己的window station,和Default桌面,这个window station是不能于用户交互的,也就是说,你不能在上面显示窗口,它也不接受用户的鼠标、键盘等输入。 我们使用用户帐户登录以后,看到的桌面,是WinSta0(window station)下的Default(desktop). WinSta0下有3个桌面: WinLogon :以Logon对话框的形式出现.当用户登录以后,WinLogon.exe切换到Default desktop. Default

C++ 编译预处理

只愿长相守 提交于 2020-02-26 12:37:07
一、简介 1、编译预处理命令均以#开头,以回车符结束; 2、每条预处理命令独占一行; 3、可以出现在程序的任意位置,但通常置于源程序的开始; 4、在C++编译对源程序进行编译之前,先对程序中这些命令进行预处理; 5、C++预处理主要有三种: 文件包含、宏定义和条件编译 。 二、文件包含 1、格式 格式1:#include <filename> C++编译系统预定义的包含文件,这些文件在c++编译系统的include目录或其子目录中,通知预处理程序按系统规定路径检索文件。 格式2:#include “filename” 从当前工作目录开始查找,一般为自定义头文件。 2、预处理程序对源文件进行扫描时,将产生一个临时文件,用于存放预处理结果,当遇到#include “文件名”时,则将源文件复制到一个临时文件,并用指定的包含文件替代#include命令行。 3、 通常,头文件中声明的是共用的数据结构类型、函数原型、宏定义、全局变量 等。主要好处是对后续编程约定。 三、宏定义 1、不带参数的宏定义 #define 标示符 字符或字符串 2、带参数的宏 #define 宏名(参数表) 使用参数的字符或字符串 3、宏的作用域:从宏定义到本源程序文件结束。 终止宏作用域:#undef 宏名 如: #define PI 3.14 …… #undef PI 4、在宏定义时,宏名与左括号之间不能有空格,