extern

The usage of extern in c++

旧巷老猫 提交于 2019-11-29 09:14:30
I've having difficulty understanding how 'extern' works. I've searched Google but there doesn't seem to be the particular example case I'm trying If i have a file main.cpp which references one.h and in it i have a list named LIST1 (which is a double array of 100 x 100) so I have double List1[100][100]; how can i use this list in one.cpp please? extern double LIST1[100][100] is not working :/ main.cpp: #include "one.h" extern double LIST1[100][100]; one.cpp: void one::useList() { for(j = 0; j < 100; j++) { for(i = 0; i < 100; i++) { LIST1[j,i] = 0.5; } } } This is what I have. Error I'm getting

关于定义变量的技巧

做~自己de王妃 提交于 2019-11-29 06:29:50
1.全局变量 众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中 extern 关键字调用的变量。因此,必须在 .c和 .h 文件中定义。这种重复的定义很容易导致错误。以下讨论的方法只需用在头文件中定义一次。虽然有点不易懂,但一旦掌握,使用起来却很灵活。如下定义出现在定义所有全局变量的.h头文件中。 #ifdef xxx_GLOBALS #define xxx_EXT #else #define xxx_EXT extern #endif .h文件中每个全局变量都加上了xxx_EXT的前缀。xxx代表模块的名字。该模块的.c文件中有以下定义: #define xxx_GLOBALS #include "includes.h" 当编译器处理.c文件时,它强制xxx_EXT(在相应.H文件中可以找到)为空,(因为xxx_GLOBALS已经定义)。所以编译器给每个全局变量分配内存空间,而当编译器处理其他.c文件时,xxx_GLOBAL没有定义,xxx_EXT被定义为extern,这样用户就可以调用外部全局变量。为了说明这个概念,可以参见uCOS_II.h,其中包括以下定义: #ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT extern #endif OS_EXT INT32U OSIdleCtr; OS_EXT

txt操作

随声附和 提交于 2019-11-29 06:03:58
C#解决读写包含汉字的txt文件时乱码的问题 C#解决读写包含汉字的txt文件时乱码的问题 当我们用System.IO.StreamReader读取包含汉字的txt文件时,经常会读出乱码(StreamWriater写文本文件也 有类似的问题),原因很简单,就是文件的编码(encoding)和StreamReader/Writer的encoding不对应。 为了解决这个问题,我写了一个类,来取得一个文本文件的encoding,这样我们就可以创建对应的 StreamReader和StreamWriter来读写,保证不会出现乱码现象。其实原理很简单,文本编辑器(比如XP自带的记事 本)在生成文本文件时,如果编码格式和系统默认的编码(中文系统下默认为GB2312)不一致时,会在txt文件开头 部分添加特定的“编码字节序标识(Encoding Bit Order Madk,简写为BOM)”,类似PE格式的"MZ"文件头。这样 它在读取时就可以根据这个BOM来确定该文本文件生成时所使用的Encoding。这个BOM我们用记事本等程序打开默认 是看不到的,但是用stream按字节读取时是可以读到的。我的这个TxtFileEncoding类就是根据这个BOM“文件头” 来确定txt文件生成时用到的编码的。 // 作者:袁晓辉 // 2005-8-8 // // // // // // using

C#&.Net干货分享- 构建PrinterHelper直接调用打印机相关操作

浪子不回头ぞ 提交于 2019-11-29 06:03:53
namespace Frame.Printer { /// <summary> /// /// </summary> public class PrinterHelper { private PrinterHelper() { } #region API声明 /// <summary> /// /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] internal struct structPrinterDefaults { [MarshalAs(UnmanagedType.LPTStr)] public String pDatatype; public IntPtr pDevMode; [MarshalAs(UnmanagedType.I4)] public int DesiredAccess; }; /// <summary> /// /// </summary> /// <param name="printerName"></param> /// <param name="phPrinter"></param> /// <param name="pd"></param> /// <returns></returns> [DllImport("winspool.Drv",

extern "C"的用法

a 夏天 提交于 2019-11-29 05:02:55
一、extern关键字定义: extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 记住,下列语句:仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 二、extern的用法: 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。 extern int aaa;//extern 关键字,表示aaa从其他文件模块中已经定义。 三、extern "C"的用法1: 指示编译器这部分代码按照C语言方式编译和连接进行编译。而不是C++的方式。 用法1:在C++环境下使用C语言方式编译DLL,保证函数名称不变。 extern "C" _declspec(dllexport) void fun(int a,int b). 用法2:在C++中引用C语言函数和变量,在包含C语言头文件进行处理 extern "C" { #include "cExample.h" }

Is extern keyword really necessary?

六眼飞鱼酱① 提交于 2019-11-29 04:30:31
... #include "test1.h" int main(..) { count << aaa <<endl; } aaa is defined in test1.h ,and I didn't use extern keyword,but still can reference aaa . So I doubt is extern really necessary? extern has its uses. But it mainly involves "global variables" which are frowned upon. The main idea behind extern is to declare things with external linkage. As such it's kind of the opposite of static . But external linkage is in many cases the default linkage so you don't need extern in those cases. Another use of extern is: It can turn definitions into declarations. Examples: extern int i; // Declaration

gcc和g++的区别 (很详细的描述)

ⅰ亾dé卋堺 提交于 2019-11-29 04:28:00
gcc和g++都是GNU(组织)的一个编译器。 误区一: gcc只能编译c代码,g++只能编译c++代码 两者都可以 ,但是请注意: 1 . 后 缀为 .c的,gcc把它当作是C程序,而g++当作是c++程序 ;后缀为.cpp的,两者都会认为是c++程序,注意,虽然 c ++ 是c的超集,但是两者对语法的要求是有区别的。 C++的语法规则更加严谨一些 。 2. 编译阶段,g++会调用gcc,对于c++代码,两者是等价的 ,但是因为 g cc 命令 不能自动和C++程序使用的库联接 ,所以通常用g++来完成链接 , 为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。 误区二: gcc不会定义__cplusplus宏,而g++会 实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。 误区三: 编译只能用gcc,链接只能用g++ 严格来说,这句话不算错误,但是它混淆了概念,应该这样说: 编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。 因为 gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。 gcc和g++的区别 我们在编译c/c++代码的时候

Can local and register variables be declared extern?

≯℡__Kan透↙ 提交于 2019-11-29 02:02:42
I have been wondering whether an extern can be declared locally and a register variable. If it can be what would be the restrictions imposed? Can local variables be declared extern? No. But a global variable can be declared extern locally. // file1.c int Count; // file2.c void foo(void) { extern int Count; Count++; } Can register variables be declared extern? No. A variable may not be extern and register . C11 dr 6.7.1 Storage-class specifiers 1 storage-class-specifier: typedef extern static _Thread_local auto register Constraints 2 At most, one storage-class specifier may be given in the

STM32中static和extern

一个人想着一个人 提交于 2019-11-29 01:55:10
今天用串口通信接收蓝牙的数据并产生中断,发现一直卡在某个莫名其妙的启动文件上,检查了很多遍多没有发现问题,最后发现问题在接受数据的变量只是局部变量,且没有赋初值,于是,程序只在中断函数运行,所以,以后写变量一定要初始化, void USART1_IRQHander(void) { static u8 r; TIM_Cmd(TIM1,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷ if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET) { r = USART_ReceiveData(USART1); USART_SendData(USART1,r); if(r == 'a') { PWMA += 100; if(PWMA >7199) { PWMA = 5000; } } if(r == 'c') { PWMA -= 100; if(PWMA <5000) { PWMA = 5000; } } if(r == 'b') { PWMB += 100; if(PWMB >7199) { PWMB = 5000; } } while(USART_GetITStatus(USART1,USART_IT_TC) != SET); } USART_ClearITPendingBit(USART1,USART_FLAG_TC); TIM_Cmd(TIM1

extern关键字详解

允我心安 提交于 2019-11-29 00:18:01
基本理解 extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 extern有两个作用 1.当它与"C"一起连用时,如: extern "C" void fun(int a, int b);告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的(不同编译器不同),因为C++支持函数的重载。(详细转到我另一篇博客:https://www.cnblogs.com/WindSun/p/11334182.html) ​ 2.在头文件中: extern int g_Int; 它的作用就是声明全局变量或函数的作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用,记住它是一个声明不是定义。也就是说B模块如果引用A模块中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。 extern用在变量声明中常常有这样一个作用,在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。 extern的注意事项 (1)extern数组变量