VC内变量类型名称的定义文件
Visual C++(简称VC++)简介
![Visual C++(简称VC++)简介](https://img.taocdn.com/s3/m/0594aa26ccbff121dd368331.png)
Visual C++简介Visual C++(简称VC++)是美国Microsoft公司开发的Microsoft Visual Studio的一部分,是一个使用广泛的C/C++集成化开发环境。
它成功地将面向对象和事件驱动编程概念联系起来,并得到了很好的配合,使得编写Windows应用程序的过程变得简单、方便且代码量小。
VC++ 6.0集程序的代码编辑、编译、连接、调试于一体,给编程人员提供了一个完整、方便的开发界面和许多有效的辅助开发工具。
VC++6.0的编辑环境包含了许多独立的组件,它们是:文本编辑器、资源编辑器、C/C++编译器、连接器、调试器、AppWizard、ClassWizard、源程序浏览器以及联机帮助。
所有这些构件的功能都隐藏在VC++6.0的菜单和工具条中。
通过该集成环境,程序员可以观察和控制整个开发进程。
VC++6.0的主窗口可以分为如图1所示的几个部分。
典型的Windows应用程序结构有4种:–控制台应用程序–基于框架窗口的应用程序–基于对话框的应用程序–基于文档/视图结构图1VC 6.0的主窗口菜单栏工具栏工作区窗口编辑子窗口输出子窗口VC++既可用于管理基于Windows的应用项目,也可用于管理基于DOS的应用项目。
基于DOS的应用系统也称为控制台应用系统。
控制台应用程序结构简单,可以不使用MFC类库。
一、Visual C++6.0菜单介绍:1.文件菜单文件菜单中共有14个菜单项,分成6组,组与组之间通过凹下去的横线分割开。
–第一组是基本文件操作;–第二组是工作空间操作,工作空间是VC++6.0中最大的一个处理单位,每个工作空间包括多个工程,每个工程又包含若干个文件;–第三组用于文件保存;–第四组用于文件打印。
2.编辑菜单编辑菜单包含用于编辑和搜索的命令,这些命令与其它Windows应用程序中的同名命令具有相似的功能。
3.查看菜单查看菜单包含用于检查源代码和调试信息的命令项,它可以用来设置全屏方式显示窗口,或者打开工作区窗口、输出窗口和各种调试窗口。
C语言教程课件第二章 数据类型、运算符和表达式
![C语言教程课件第二章 数据类型、运算符和表达式](https://img.taocdn.com/s3/m/19446337eefdc8d376ee3266.png)
例 整型变量的定义与使用
#include <stdio.h> void main() { int a,b,c,d; /*指定a、b、c、d为整型变量*/ unsigned u; /*指定u为无符号整型变量*/ a=12;b=-24;u=10; c=a+u;d=b+u; printf("a+u=%d,b+u=%d\n",c,d); }
例 向字符变量赋以整数。 • 运行结果: #include <stdio.h> a b void main() 97 98 { char c1,c2; c1=97; c2=98; printf("%c %c\n",c1,c2); printf("%d %d\n",c1,c2); }
• 说明:在第4和第5行中,将整数97和98分别赋给c1和c2,它 的作用相当于以下两个赋值语句: c1='a';c2='b'; 因为'a'和'b'的ASCII码为97和98
• 字符型变量用来存放字符常量,注意只能放一个字符。 • 字符变量的定义形式如下:char c1,c2; • 在本函数中可以用下面语句对c1,c2赋值: c1='a';c2='b'; • 一个字符变量在内存中占一个字节; • 将一个字符常量放到一个字符变量中,是将该字符的 相应的ASCII代码放到存储单元中,这样使字符型数据 和整型数据之间可以通用。一个字符数据既可以以字 符形式输出,也可以以整数形式输出。
运行结果: total=300 例2.1 符号常量的使用 #define PRICE 30 #include <stdio.h> void main ( ) 说明:如再用赋值语句给PRICE赋值是错的 { PRICE=40;/*错误,不能给符号常量赋值*/ int num, total; num=10; total=num * PRICE; printf(″total=%d\n ″,total); } 说明: 程序中用#define命令行定义PRICE代表常量30,此后凡在 本文件中出现的PRICE都代表30,可以和常量一样进行运算
VC变量命名规则
![VC变量命名规则](https://img.taocdn.com/s3/m/4ceda28084868762caaed598.png)
转载:vc软件开发规范--------------------------------------------------------------------------------一、程序风格:1、严格采用阶梯层次组织程序代码:各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行。
要求相匹配的大括号在同一列,对继行则要求再缩进4格。
例如:2、提示信息字符串的位置在程序中需要给出的提示字符串,为了支持多种语言的开发,除了一些给调试用的临时信息外,其他所有的提示信息必须定义在资源中。
3、对变量的定义,尽量位于函数的开始位置。
二、命名规则:1、变量名的命名规则①、变量的命名规则要求用“匈牙利法则”。
即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写。
即:变量名=变量类型+变量的英文意思(或缩写)对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下表:bool(BOOL) 用b开头 bIsParentbyte(BYTE) 用by开头 byFlagshort(int) 用n开头 nStepCountlong(LONG) 用l开头 lSumchar(CHAR) 用c开头 cCountfloat(FLOA T) 用f开头 fAvgdouble(DOUBLE) 用d开头 dDetavoid(VOID) 用v开头 vV ariantunsigned int(WORD)用w开头 wCountunsigned long(DWORD) 用dw开头 dwBroadHANDLE(HINSTANCE)用h开头 hHandleDWORD 用dw开头 dwWordLPCSTR(LPCTSTR) 用str开头 strString用0结尾的字符串用sz开头 szFileName对未给出的变量类型要求提出并给出命名建议给技术委员会。
《C语言程序设计》课程标准
![《C语言程序设计》课程标准](https://img.taocdn.com/s3/m/944d5fa6294ac850ad02de80d4d8d15abe2300c0.png)
《C语言程序设计》课程标准一、课程性质该课程是人工智能技术应用专业的专业基础课程,目标是让学生全面了解程序设计的总体思路、程序设计的基本算法、结构化程序设计的方法,具有初步的程序设计和程序调试的能力。
它要以《计算机应用基础》课程的学习为基础,也是进一步学习《Python高级编程》、《嵌入式技术应用》《机器学习基础》等课程的基础。
二、课程设计思路本课程主要针对软件程序员、软件测试员等岗位开设。
通过本课程的学习,能够熟练掌握C语言的语法规则以及使用C语言进行结构化程序设计的方法与编程技巧,具备独立完成完整C语言项目的基本技能和专业技能,具备基本的职业能力,并使岗位适应能力与操作技能达到软件开发上岗标准。
本课程的开设还为学习《Python高级编程》、《嵌入式技术应用》《机器学习基础》等后续课程奠定基础。
三、课程目标(一)总体目标通过本课程的学习,使学生掌握C语言程序设计的基础知识和基本技能,树立结构化程序设计的基本思想,养成良好的编程习惯,具备软件开发的基本能力。
同时培养学生良好的分析问题和解决问题的能力及爱岗敬业、严谨细致、探究务实的职业精神和技术意识,为后续的应用性课程和系统开发课程打好软件基础。
(二)具体目标1.专业能力(1)对计算机语言和结构化程序设计有基本的认识;(2)能够熟练应用TC或VC++集成环境设计和调试C语言程序;(3)能够在程序设计过程中熟练运用C语言数据类型、运算符、基本语句、数组、函数、编译预处理命令等基本知识;(4)能够熟练掌握指针、结构体、文件等基本知识;(5)会运用C语言设计解决实际问题的程序,并能完成程序的测试。
2.方法能力(1)培养良好的接受新技术、新应用的能力;(2)培养良好的需求理解能力;(3)培养模块化思维能力;(4)培养良好的学习和总结的能力。
3.社会能力(1)培养良好的团队精神和协作能力。
(2)培养学生认真负责的工作态度和严谨细致的工作作风。
四、课程内容组织与安排本课程以国内外最新程序设计基础课程的教学大纲为参照,以软件开发职业岗位为起点,以实际应用为目标,设计了10个学习子项目。
at89c51变量类型
![at89c51变量类型](https://img.taocdn.com/s3/m/579e5d710a4c2e3f5727a5e9856a561252d32198.png)
at89c51变量类型
AT89C51是一种微控制器,其变量类型取决于编程语言和编译器。
在C语言中,常用的变量类型包括:
1. `char`:字符型变量,用于存储单个字符。
2. `int`:整型变量,用于存储整数。
3. `float`:浮点型变量,用于存储浮点数。
4. `double`:双精度浮点型变量,用于存储双精度浮点数。
5. `void`:无类型变量,用于表示没有类型。
6. `struct`:结构体类型,用于组合多个不同类型的数据。
7. `union`:联合体类型,用于在同一块内存中存储不同的数据类型。
8. `enum`:枚举类型,用于定义一组命名的常量。
这些变量类型可以根据需要进行组合和嵌套,以满足具体的应用需求。
vc++匈牙利命名法
![vc++匈牙利命名法](https://img.taocdn.com/s3/m/7046b847a8956bec0975e3c0.png)
匈牙利命名法是一种编程时的命名规范。
基本原则是:变量名=属性+类型+对象描述。
其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
命名要基于容易记忆容易理解的原则。
目前在Windows程序开发和MFC程序开发中常用的命名规则是匈牙利命名法。
下面就是HN命名法的一般规则。
属性部分全局变量g_const常量c_c++类成员变量m_静态变量s_类型部分指针p函数fn无效v句柄h长整型l布尔b浮点型(有时也指文件) f双字dw字符串sz短整型n双精度浮点d计数c(通常用cnt)字符ch(通常用c)整型i(通常用n)字节by字w实型r无符号u描述部分最大Max最小Min初始化Init临时变量T(或Temp)源对象Src目的对象Dest这里顺便写几个例子:(1) hwnd :h 是类型描述,表示句柄,wnd 是变量对象描述,表示窗口,所以hwnd 表示窗口句柄;(2) pfnEatApple :pfn 是类型描述,表示指向函数的指针,EatApple 是变量对象描述,所以它表示指向EatApple 函数的函数指针变量。
(3) g_cch :g_ 是属性描述,表示全局变量,c 和ch 分别是计数类型和字符类型,一起表示变量类型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
小结:匈牙利命名法MFC、句柄、控件及结构的命名规范Windows类型样本变量MFC类样本变量HWND hWnd;CWnd* pWnd;HDLG hDlg;CDialog* pDlg;HDC hDC;CDC* pDC;HGDIOBJ hGdiObj;CGdiObject* pGdiObj;HPEN hPen;CPen* pPen;HBRUSH hBrush;CBrush* pBrush;HFONT hFont;CFont* pFont;HBITMAP hBitmap;CBitmap* pBitmap;HPALETTE hPaltte;CPalette* pPalette;HRGN hRgn;CRgn* pRgn;HMENU hMenu;CMenu* pMenu;HWND hCtl;CState* pState;HWND hCtl;CButton* pButton;HWND hCtl;CEdit* pEdit;HWND hCtl;CListBox* pListBox;HWND hCtl;CComboBox* pComboBox;HWND hCtl;CScrollBar* pScrollBar;HSZ hszStr;CString pStr;POINT pt;CPoint pt;SIZE size;CSize size;RECT rect;CRect rect;一般前缀命名规范前缀类型实例C 类或结构CDocument,CPrintInfom_ 成员变量m_pDoc,m_nCustomers变量命名规范前缀类型描述实例ch char 8位字符chGradech TCHAR 如果_UNICODE定义,则为16位字符chNameb BOOL 布尔值bEnablen int 整型(其大小依赖于操作系统)nLengthn UINT 无符号值(其大小依赖于操作系统)nHeightw WORD 16位无符号值wPosl LONG 32位有符号整型lOffsetdw DWORD 32位无符号整型dwRangep * 指针pDoclp FAR* 远指针lpszNamelpsz LPSTR 32位字符串指针lpszNamelpsz LPCSTR 32位常量字符串指针lpszNamelpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针lpszName h handle Windows对象句柄hWndlpfn callback 指向CALLBACK函数的远指针资源类型命名规范前缀符号类型实例范围IDR_ 不同类型的多个资源共享标识IDR_MAIINFRAME 1~0x6FFFIDD_ 对话框资源IDD_SPELL_CHECK 1~0x6FFFHIDD_ 对话框资源的Help上下文HIDD_SPELL_CHECK 0x20001~0x26FF IDB_ 位图资源IDB_COMPANY_LOGO 1~0x6FFFIDC_ 光标资源IDC_PENCIL 1~0x6FFFIDI_ 图标资源IDI_NOTEPAD 1~0x6FFFID_ 来自菜单项或工具栏的命令ID_TOOLS_SPELLING 0x8000~0xDFFF HID_ 命令Help上下文HID_TOOLS_SPELLING 0x18000~0x1DFFFIDP_ 消息框提示IDP_INVALID_PARTNO 8~0xDEEFHIDP_ 消息框Help上下文HIDP_INVALID_PARTNO 0x30008~0x3DEFF IDS_ 串资源IDS_COPYRIGHT 1~0x7EEFIDC_ 对话框内的控件IDC_RECALC 8~0xDEEFMicrosoft MFC宏命名规范名称类型_AFXDLL 唯一的动态连接库(Dynamic Link Library,DLL)版本_ALPHA 仅编译DEC Alpha处理器_DEBUG 包括诊断的调试版本_MBCS 编译多字节字符集_UNICODE 在一个应用程序中打开UnicodeAFXAPI MFC提供的函数CALLBACK 通过指针回调的函数库标识符命名法标识符值和含义u ANSI(N)或Unicode(U)d 调试或发行:D = 调试;忽略标识符为发行。
VC中定义全局变量
![VC中定义全局变量](https://img.taocdn.com/s3/m/7796343f5727a5e9856a61df.png)
很喜欢API函数的那种调用方法,不论在哪个类中只要用“::API函数”就可以调用了。合理利用静态类型(static)可以实现与此相似的全局变量和全局函数。
静态变量和静态函数有如下性质:
若在一个类中用关键字static声明数据成员,则这个数据成员就只存在一个拷贝,无论该类创建了多少个实例,它始终只存在一个,即使该类的实例一个也没创建,它也存在。
return y;
}
定义在CTestApp类中的变量和函数可以在其它类中被访问。比如在视图的某函数中要访问变量x和函数f():
void CTestView::xyz()
{
CTestApp *app = (CTestApp *)AfxGetApp(); //生成指向应用程序类的指针
app->x = 0; //访问变量x
使用的时候CTestApp *app=(CTestApp*)AfxGetApp();
app->cs="Global"
防错措施:
若定义的函数和全局变量在多个文件包含且造成嵌套或多次调用的话,这样将导致这个头文件每被包含依次,函数或变量就被重新定义一次,在链接编译时会导致重定义错误。为此需要使用一种被称为Guard macro的技术来保证不出错。在一个头文件开头加上
单击“Insert”菜单下的“New Class”命令,选择“Class type”为“Generic Class”,在“Name”栏中填入类名“CPublic”,单击“OK”,则新类建立完毕。
2、包含公用类的头文件,使各个类都能访问它
CPublic的头文件应包含在应用程序类的头文件中,这样在其它类中引用CPublic类时就不需要再包含了。
C语言程序设计代码规范
![C语言程序设计代码规范](https://img.taocdn.com/s3/m/a3d2366c52ea551811a6872b.png)
C++语言程序设计代码规范1 命名规范本规范对变量、函数、类(结构)等的名称有严格的规定,在编码过程中务必遵守。
1.1 变量命名规范变量名称采用匈牙利命名法,即:完整的名称由“缀”和“主体”复合而成。
“缀”用于指示变量的种类、数值类型、作用域等属性,由小写字符和下划线(_)组成,根据其附着在“主体”的位置分为前缀和后缀两种。
“主体”表示变量的语义。
整个变量名称的格式如下:<作用域前缀>[<指针缀>]<类型缀><主体><作用域后缀>下面详细论述。
1.1.1 作用域缀(前缀和后缀)作用域前缀处在整个变量名的最前面。
常用的作用域前缀为:作用域后缀处在整个变量名的最后面。
只有一种情况使用作用域后缀,就是函数的形参必须以作用域后缀结束。
1.1.2 指针缀如果一个变量是指针,则必须使用指针缀。
指针缀使用字母p表示。
以前,在DOS平台下有短指针和长指针的区别,有时称长指针为lp。
在Win32平台下已经不存在这个区别了,所以统一使用p, 而不是lp。
1.1.3 类型缀类型缀由小写字符构成,用于描述变量的类型。
注意:1.不要私自创造出各种各样的前缀。
2.也没有必要在前缀中仔细区分一些细小的类型区别,那样会给代码维护工作带来额外的麻烦。
常用的类型前缀为:对于其他不在上面表中的结构、类等复杂数据类型,特别是不常使用的和不通用的,不使用前缀。
例如:class Person Jonson;struct DateTime MyDt;在应用场合明确的情况下,例如:简单的局部变量,它的值类型前缀有时可以省略。
具体见下面的例子。
1.1.4 复合前缀根据以上规则,变量根据它所在的作用域、类型、是否是指针,得到一个复合前缀。
例如:char g_szFileName[_MAX_PATH]; //全局字符串变量char* g_pszFileName; //全局字符串指针变量:char s_szFileName[_MAX_PATH]; //静态字符串变量char* s_pszFileName; //静态字符串指针变量:char _s_szFileName[_MAX_PATH]; //局部静态字符串变量char* _s_pszFileName; //局部静态字符串指针变量:char m_szFileName[_MAX_PATH]; //类字符串变量char* m_pszFileName; //类字符串指针变量:char ms_szFileName[_MAX_PATH]; //类静态字符串变量char* ms_pszFileName; //类静态字符串指针变量:更多的例子,参见下面按照作用域讨论变量名一节。
c语言头文件中定义全局变量的问题
![c语言头文件中定义全局变量的问题](https://img.taocdn.com/s3/m/b7eac4e7541810a6f524ccbff121dd36a32dc4a3.png)
c语⾔头⽂件中定义全局变量的问题问题是这么开始的:最近在看⼀个PHP的扩展源码,编译的时候的遇到⼀个问题:ld: 1 duplicate symbol for architecture x86_64仔细看了⼀下源码,发现在头⽂件中出现了全局变量的定义。
简化⼀下后,可以这么理解:// t1.h#ifndef T1_H#define T1_Hint a = 0;#endif//------------------//t1.c#include "t1.h"#include "t2.h"int main(){return 0;}//-----------------//t2.h#include "t1.h"//empty//----------------//t2.c#include "t2.h"//empty//-------这两个c⽂件能否通过编译?想必有点经验的必会说不会,重定义了。
那么是否真的如此?并不这么简单。
第⼀个问题,#ifndef 的这个宏是否防⽌了重定义(redefinition)?答案:是。
但是是在单个translation unit中(wiki )。
#ifndef 的头⽂件宏称为 include guards的()我们知道,⼀个完整的编译的过程是经过one.c --> PREPROCESSOR -> tmp.c(temporary) -> COMPILER -> one.obj -> LINKER -> one.exe这三个过程的,⽽在预编译阶段,便会把include的⽂件展开,我们使⽤cc -E 命令来查看t1.c的预编译的结果:➜ t cc -E t1.c# 1 "t1.c"# 1 "<built-in>" 1# 1 "<built-in>" 3# 321 "<built-in>" 3# 1 "<command line>" 1# 1 "<built-in>" 2# 1 "t1.c" 2# 1 "./t1.h" 1int a = 0;# 3 "t1.c" 2# 1 "./t2.h" 1# 4 "t1.c" 2int main(void){return 0;}看到编译器把 t1.h 做了展开,我们看到了 a的定义。
单片机c语言的sbit和sfr
![单片机c语言的sbit和sfr](https://img.taocdn.com/s3/m/ec437fc16edb6f1afe001f41.png)
1.bit和sbit都是C51扩展的变量类型。
bit和int char之类的差不多,只不过char=8位, bit=1位而已。
都是变量,编译器在编译过程中分配地址。
除非你指定,否则这个地址是随机的。
这个地址是整个可寻址空间,RAM+FLASH+扩展空间。
bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。
一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。
sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
2.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。
它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
3.sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。
利用它可以访问51单片机内部的所有特殊功能寄存器。
如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr P1 = 0x90; //定义P1 I/O 口,其地址90Hsfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:(1) sbit 位变量名=位地址sbit P1_1 = Ox91;这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.(2) sbit 位变量名=特殊功能寄存器名^位位置sft P1 = 0x90;sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法(3) sbit 位变量名=字节地址^位位置sbit P1_1 = 0x90 ^ 1;这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ibint bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位sbit ab12=ab[1]^12;操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。
vc++中Format函数详解
![vc++中Format函数详解](https://img.taocdn.com/s3/m/a97177c24028915f804dc249.png)
问:VC中如何定义全局变量答:放在任意文件里在其它文件里用 extern 声明或者在App类中声明一个公有成员在程序其它类中可以用AfxGetApp() 得到一个App对象指针,将它转化成你的App类指针然后就可以通过指针->变量使用了还有就是在MFC中定义只有静态成员的类到时候直接应用就可以了,还不破坏结构答:也可以新建一个.h的头文件,专门用来放全局变量。
哪里要用到它,就Include一下全局变量一般这样定义:1。
在一类的.cpp中定义int myInt;然后再在要用到的地方的.cpp里extern int myInt;这样就可以用了。
2。
在stdafx.cpp中加入:int myInt;然后在stdafx.h中加入:extern int myInt这样定义以后无论在什么档中都是可见的.3。
比较规范的是,先定义一个Glbs.h,把所有的全局变量原始定义放进去。
然后定义一个Externs.h,把你先前定义在Glbs.h中的变数都加上extern。
注意:如果你在Glbs.h中设置了初值,那么在Externs.h中就不要加值了。
然后调用时,第一次调用的#i nclude <Glbs.h>,以后调用的#i nclude <Externs.h>另:问:如何在VC++中使用全局变量,以使文档中的所有类都能访问。
答:把该变量放到该应用程序类的头文件中的attribute处。
然后,在程序的任何地方,你都可以用下面的方法来访问该变量:CMyApp *app=(CMyApp*)AfxGet-App();app->MyGlobalV ariable=…用这个方法,不但可以定义全局变量,也可以定义全局对象。
例如:MyClass MyObject;CMyApp*app=(CMyApp*)AfxGet-App();app->MyObject.MyFunction();VC中使用全局变量的2种办法及防错措施1. 对于全局变量存在和函数一样的问题,为了在其它CPP档中能够访问这些变量,必须在主文件的H檔中加上extern声明,格式如下:extern varibletype var; (声明)在主文件的CPP档中定义varibletype var; (定义)例子:AppWizard建立一个Test工程那么在Test.h中声明extern CString cs;在Test.app定义CString cs;如果要定义整个工程的全局变量,在任何一个CPP档中进行定义,然后在需要引用这个变量的文件中进行声明。
VC的工程设置解读Project—Settings
![VC的工程设置解读Project—Settings](https://img.taocdn.com/s3/m/88b564c2a1c7aa00b52acbdd.png)
VC的工程设置解读Project—SettingsVC工程设置可能会直接影响到工程的正确性,有时是BUG产生的直接原因,在出现莫名其妙的错误,首先应考虑到是否是工程设置有问题,这无论对于开发还是测试,都是很必要的,本文大致介绍一下工程设置选项。
工程选项的快捷建是Alt+F7, 左边的列表可以选择要设置的工程编译方式(Debug或Release),如果多个工程,还可以选择要设置的工程。
右边是一个属性页,内容十分丰富,依次是:General , Debug , C/C++ , Link , Resource , MIDL , Browse Info , Custom Build , Pre-link Step , Post-build step下面主要介绍一下我们常用到的选项:一、General: 设置工程的一般特性,组合框为是否选用MFC静态库,默认为共享的DLL方式,对一些不支持MFC42的机器环境来说,选择静态编译还是有必要的。
底下的两个编辑框表示编译中的文件输出路径。
二、Debug:设置工程调试的选项。
1.Excutable for debug session : 如果是dll的工程,需要指定启动它的exe文件路径,如果是exe工程,默认当前工程。
2.Work directory 设置调试程序的工作路径,默认exe当前路径3.Program arguments 程序启动命令行参数,作控制台程序的时候经常要用三、C/C++ : 这一页内容很多,选择项通过Category(种类)来设置,包括:1.General2.Warning leve 警告级别,VC默认为3,一般不更改3.Optimizations优化级别,DEBUG下设为Disable(Debug),就是不优化,在追求效率或者编译结果的时候可以选择最大速度或最小尺寸的选项,不过微软不保证优化的准确性。
4.Waring as error : 不用多说了,经常忽略警告的人不会选这项吧?5.Generate browse info : 产生浏览信息,在编辑调试加了一些功能,单会产生很大的编译文件,建议不要选。
C语言变量名命名规则
![C语言变量名命名规则](https://img.taocdn.com/s3/m/e29f4c0ba2161479171128bf.png)
二、命名规则:
1、变量名的命名规则
①、变量的命名规则要求用“匈牙利法则”。即开头字母用变量的类型,
其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求
单词的第一个字母应大写。
即:
变量名=变量类型+变量的英文意思(或缩写)
====//
//
功能:
从一个 String
中删除另一个
String。
//
参数:
strByDelete,strToDelete
//
(入口)
strByDelete:
被删除的字符串
(原来的字符串)
//
(出口)
strToDelete:
要从上个字符串
中删除的字符串。
//
返回:
找到并删除返回 1,否则返回 0。(对返回
于 8 个字母。
例如:
long
cmGetDeviceCount(……);
3、函数参数规范:
①、
参数名称的命名参照变量命名规范。
②、
为了提高程序的运行效率,减少参数占用的堆栈,传递大
结构的参数,一律采用指针或引用方式传递。
③、
为了便于其他程序员识别某个指针参数是入口参数还是出
口参数,同时便于编译器检查错误,应该在入口参数前加入 const 标志。
③、
在注释中应该详细说明函数的主要实现思路、特别要注明
自己的一些想法,如果有必要则应该写明对想法产生的来由。对一些模仿的函数
应该注释上函数的出处。
④、
在注释中详细注明函数的适当调用方法,对于返回值的处
VC工程中各种文件
![VC工程中各种文件](https://img.taocdn.com/s3/m/b9ce40c5bb4cf7ec4afed0fa.png)
dsw, aps, clw, plg这些文件都可以删除。
只保留 H,C,CPP,DSP,RC,剩余文件去除只读属性,其余全部删除。
然后打开DSP 有提示选 YES,就可以了*.dsp(DeveloperStudio Project):是VC++的工程配置文件,比如说你的工程包含哪个文件,你的编译选项是什么等等,编译的时候是按照.dsp的配置来的。
*.dsw(DeveloperStudio Workspace):是工作区文件,用来配置工程文件的。
它可以指向一个或多个.dsp文件。
*.clw:是 ClassWizard信息文件,实际上是INI文件的格式,有兴趣可以研究一下.有时候ClassWizard出问题,手工修改CLW文件可以解决.如果此文件不存在的话,每次用ClassWizard的时候绘提示你是否重建。
*.opt:工程关于开发环境的参数文件,如工具条位置等信息。
*.aps:(AppStudio File),资源辅助文件,二进制格式,一般不用去管他。
*.rc:资源文件。
在应用程序中经常要使用一些位图、菜单之类的资源, VC中以rc为扩展名的文件称为资源文件, 其中包含了应用程序中用到的所有的windows资源, 要指出的一点是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改。
*.plg:是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件,一般用处不大),在Tools->Options里面有个选项可以控制这个文件的生成。
*.hpj:(Help Project)是生成帮助文件的工程,用microsfot Help Compiler可以处理。
*.mdp:(Microsoft DevStudio Project)是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的DSP格式。
*.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。
VC C 的类举例详解
![VC C 的类举例详解](https://img.taocdn.com/s3/m/4c37557ef5335a8102d22035.png)
bool isLeapYear(Date d) {
return (d.year % 4==0 && d.year % 100!=0)||(d.year % 400==0); }
结构类型的定义还是存在局限性,它只定义了一组不同类型数据 的集合,而没有定义相关操作,如赋值、输出等。特别是在一个程序 员接手另一个程序员工作的时候,这种对结构的理解和编写相关操作 的负担加重了。
class Date {
int year,month,day; public:
void set(int y,int m,int d) {
year=y;month=m;day=d; }//;赋值操作,默认内联 bool isLeapYear(); void print(); };
// 判断闰年 // 输出日期
4、给结构变量的赋值就是给各成员赋值。可用输入语句或赋值
语句来完成。
例题:日期结构
#include<iostream> #include<iomanip> using namespace std;
struct Date {
int year; int month; int day; };
void print(Date); bool isLeapYear(Date d);
2)在定义结构类型的同时说明结构变量。例如: struct Stu {
char name[20]; char sex; int age; float score; }boy1,boy2;
vc,cstring,命名规范
![vc,cstring,命名规范](https://img.taocdn.com/s3/m/91c6144bf46527d3240ce06c.png)
竭诚为您提供优质文档/双击可除vc,cstring,命名规范篇一:匈牙利命名法vc++前缀规则匈牙利命名法匈牙利命名法是一种编程时的命名规范。
基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
命名要基于容易记忆容易理解的原则。
保证名字的连贯性是非常重要的。
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为switchboard时,变量全称应该为frmswitchboard。
这样可以很容易从变量名看出switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成lblswitchboard。
可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。
这种命名技术是由一位能干的microsoft程序员查尔斯·西蒙尼(charlessimonyi)提出的,他出生在匈牙利。
在microsoft公司中和他一起工作的人被教会使用这种约定。
这对他们来说一切都很正常。
但对那些simonyi领导的项目组之外的人来说却感到很奇特,他们认为这是死板的表达方式,甚至说带有这样奇怪的外观是因为它是用匈牙利文写的。
从此这种命名方式就被叫做匈牙利命名法。
据说这种命名法是一位叫charlessimonyi的匈牙利程序员发明的,后来他在微软呆了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。
现在,大部分程序员不管自己使用什么软件进行开发,或多或少都使用了这种命名法。
这种命名法的出发点是把量名变按:属性+类型+对象描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解,下面是hn变量命名规范,其中也有一些是我个人的偏向:属性部分全局变量g_常量c_c++类成员变量m_静态变量s_类型部分指针p函数fn无效v句柄h长整型l布尔b浮点型(有时也指文件)f双字dw字符串sz短整型n双精度浮点d计数c(通常用cnt)字符ch(通常用c)整型i(通常用n)字节by字w实型r无符号u描述部分最大max最小min初始化init临时变量t(或temp)源对象src目的对象dest这里顺便写几个例子:hwnd:h是类型描述,表示句柄,wnd是变量对象描述,表示窗口,所以hwnd表示窗口句柄;pfneatapple:pfn是类型描述,表示指向函数的指针,eatapple是变量对象描述,所以它表示指向eatapple函数的函数指针变量。
VisualStudio简单使用常识操作
![VisualStudio简单使用常识操作](https://img.taocdn.com/s3/m/339f051f7dd184254b35eefdc8d376eeaeaa17c8.png)
VisualStudio简单使⽤常识操作Visual Studio 简单使⽤个⼈总结 转载请注明来源:/icmzn(后续会持续更新) 可以查看⼀下链接,官⽅关于visual studio 2010 的介绍 []当前系统中存在两个cvtres.exe⽂件,版本不同。
让VS2010使⽤.NET 4.5的cvtres.exe程序。
VC模块:D:\ProgramFiles\Administrator\MicrosoftVisualStudio10\VC\bin\cvtres.exe.NET模块:C:\Windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7601.17514_none_ba1c770af0b2031b\cvtres.exe则对VC模块下的cvtres.exe重命名,或者删除即可,或者将.NET的这个⽂件替换VC模块下的⽂件4. 常⽤的快捷⽅式技巧(1)ctrl + tab 可以在编辑菜单页⾯进⾏切换,以及现有窗⼝直接进⾏选择处理;最有⽤的,在窗⼝之间来回跳转是⼗分⽅便的。
shift + tab 键,可以砸UI界⾯中的空间之间进⾏切换。
(2)alt + F9 输出端⼝调试断点窗⼝;(3)shif + alt + enter :对当前编辑页⾯进⾏全屏或者还原;(4)ctrl + shift + n :打开项⽬对话框进⾏添加新项⽬;(5)ctrl + shift + o :打开项⽬或者解决⽅案对话框;(6)alter + enter : 打开属性控制⾯板(窗⼝)(7)F5启动调试(8)按住Ctrl + 滚轮,可以放⼤或缩⼩编辑框的字体⼤⼩5.⼀个解决⽅案可以允许放多个⼯程项⽬6.将visual studial 的当前环境设置导出为⼀个⽂件,这样可以将这个⽂件导⼊到任何⼀个当脑中。
从⽽当前的环境不变。
设置后⾃⼰的样式,⽂件即可,保留当前环境。
VC++编码规范
![VC++编码规范](https://img.taocdn.com/s3/m/edede929647d27284b735162.png)
VC++编码规范1.目的本编码规范所要达到的目的为:⏹帮助程序员标准化程序或类库的结构和逻辑;⏹使代码更加精确、完整、意思明确和更好的可读性;⏹尽可能地与其它编程语言的规范和约定保持一致;⏹通过规范的代码原则来减少常见的编程笔误及部分逻辑错误的发生。
本标准将提供以下项目的指导规范:⏹代码规划⏹注释⏹基本类的设计⏹命名约定⏹源代码设计⏹标准注释块(例如类定义前面的描述等)、资源定义和控制的表示⏹Unicode2.代码编写规范2.1 变量声明变量声明必须尽可能地靠近最开始使用它的地方,与此同时进行变量的初始化赋值,除非此变量是一个类对象,并且有一个缺省构造函数举例:short a;a = 6; //错误short a = 6; //正确2.2 “{ }”的使用“{”和“}”都必须放在各自单独的一行。
唯一能跟在大括弧后面的文字只有注释,但也仅限于在“}”的后面。
配对的大括弧必须上下对齐,即配置相同的缩进量。
跟在左括弧“{”后面的语句必须比“{”的位置向后缩进一个“tab”的距离。
对于任何循环和条件结构都必须使用大括弧。
例如循环条件体中只有单条语句,我们也要使用一对大括弧将此条语句括起来。
符合以上条件的结构有:⏹while⏹do ….. while⏹if⏹for例如:doaction;while ( condition );此语句必须按下面的格式来写:do{action;}又比如象这样的语句:if ( condition )action;必须写成:if ( condition ){action;}如果一对大括弧之间的语句太多,则必须在后一个大括弧“}”的后面加上注释,以指明是哪一个结构体结束。
这样在调试时,将大大增加程序的可读性。
例如,在“while”中,在“}”的后加上一注释“//end while <condition>”以表明该while循环结束。
这样的例子还有“end// switch<condition>”、“end if<condition>”等。
bit、sbin、sfr、sfr 16区别分析
![bit、sbin、sfr、sfr 16区别分析](https://img.taocdn.com/s3/m/9e87350e52ea551810a6879c.png)
bit、sbin、sfr、sfr 16区别分析1.bit和sbit都是C51扩展的变量类型。
bit和int char之类的差不多,只不过char=8位, bit=1位而已。
都是变量,编译器在编译过程中分配地址。
除非你指定,否则这个地址是随机的。
这个地址是整个可寻址空间,RAM+FLASH+扩展空间。
bit只有0和1两种值,意义有点像Windows下VC中的BOOL。
sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。
一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。
sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。
2.bit位标量bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。
它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。
3.sfr特殊功能寄存器sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。
利用它可以访问51单片机内部的所有特殊功能寄存器。
如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
sfr P1 = 0x90; //定义P1 I/O 口,其地址90Hsfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表.sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0 和1 的定义.sbit 可定义可位寻址对象.如访问特殊功能寄存器中的某位.其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:(1) sbit 位变量名=位地址:sbit P1_1 = Ox91;这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.(2) sbit 位变量名=特殊功能寄存器名^位位置:sft P1 = 0x90;sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法(3) sbit 位变量名=字节地址^位位置sbit P1_1 = 0x90 ^ 1;这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ibint bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位sbit ab12=ab[1]^12;操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:sfrt 变量名=地址值。
Citect变量专题
![Citect变量专题](https://img.taocdn.com/s3/m/16b21df5ff00bed5b8f31d5d.png)
VCQ1 Citect数值输入的两种方法?1.用键盘输入数值,见下图的文本属性定义,Temperature为变量名,小数点也要使用#代替运行后的效果如下图,鼠标放在文本框中,并用键盘输入“234”+回车即可2.弹出软键盘,见下图的文本属性定义,用到的函数为FormNumPad(Title, Input, Mode)运行后会弹出如下图一样的软键盘,如果需要小数点按钮,需要在FormNumPa d的Mode值为16VCQ2 怎样在Citect的按钮中实现脉冲命令?按钮的属性中输入<=>点击 up中写动作:变量标签=0;down中写动作:变量标签=1VCQ3 Citect变量标签的原始刻度和工程刻度是什么意思?原始刻度是PLC或者外部设备关于该变量的的一个初始量程,工程刻度是Citec t软件上需要转化的量程,原始刻度和工程刻度是成线性比例的关系。
如果原始零和工程零刻度一致,原始满和工程满刻度一致,那么此变量的数值不进行转换。
VCQ4 局部标签和磁盘虚拟变量标签的区别?局部标签和磁盘虚拟变量都是citect内部点,不计算点数。
但是局部标签不支持网络传递,磁盘虚拟变量标签支持网络传递。
补充:磁盘虚拟IO设备可以通过走快速通信向导建立--选择磁盘虚拟设备--选择citect通用协议,建立变量的时候地址是I1,I2,I3....(INT类型的变量),R1,R2,R3...(Real类型的变量),D1,D2,D3...(Digital类型的变量)VCQ5 Citect的变量能否导出到一个表格中进行修改?Citect的变量不需要导出,每个工程自带了一个变量表可以直接进行修改1,在每个工程的文件夹中有一个的文件,此文件使用excel表打开,打开以后可以进行修改变量名称,地址,IO设备等信息2,修改excel表格的宏安全性:在excel表的工具菜单--宏--安全性--低3,使用宏文件保存文件:宏文件在Citect的文件安装路径下面 program file\sch neider electric\vijeo citect\bin文件夹中文件就是宏文件,双击这个文件,然后点击添加宏即可VCQ6 为什么用Citect 的Fastlinx(speedlink)导入Unity Pro的变量标签时,AO和DO变量不能导入到Citect中呢?因为Citect中的Modnet协议的变量只可以定义成以0,1,3,4开头的变量,也就意味着可以导入%M,%I,%IW,%MW的变量,关于%Q的变量是不能导入的,需要转换成%M或%MW,对于的SpeedLink同理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#define pascal
#endif
#if defined(DOSWIN32) || defined(_MAC)
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif
#else
#define cdecl
#define MAKELONG(a, b) ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))
#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
#ifndef CDECL
#define CDECL
#endif
#endif
#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
****************************************************************************/
#ifndef _WINDEF_
#define _WINDEF_
#ifndef NO_STRICT
#ifndef STRICT
#define STRICT 1
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef OPTIONAL
#define OPTIONAL
#define FAR far
#define NEAR near
#ifndef CONST
#define CONST const
#endif
typedef unsigned long DWORD;
typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG LRESULT;
#ifndef NOMINMAX
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif
#undef FAR
#undef NEAR
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef float FLOAT;
typedef FLOAT *PFLOAT;
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
typedef unsigned int *PUINT;
#ifndef NT_INCLUDED
#include <winnt.h>
#endif /* NT_INCLUDED */
/* Types use for passing & returning polymorphic values */
#ifdef STRICT
typedef void NEAR* HGDIOBJ;
#else
DECLARE_HANDLE(HGDIOBJ);
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
typedef int far *LPINT;
typedef WORD near *PWORD;
typedef WORD far *LPWORD;
typedef long far *LPLONG;
typedef DWORD near *PDWORD;
typedef HANDLE FAR *LPHANDLE;
typedef HANDLE HGLOBAL;
typedБайду номын сангаасf HANDLE HLOCAL;
typedef HANDLE GLOBALHANDLE;
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */
#define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))
#define LOBYTE(w) ((BYTE)(w))
#define HIBYTE(w) ((BYTE)(((WORD)(w) >> 8) & 0xFF))
#ifndef WIN_INTERNAL
DECLARE_HANDLE (HWND);
* windef.h -- Basic Windows Type Definitions *
* *
typedef DWORD far *LPDWORD;
typedef void far *LPVOID;
typedef CONST void far *LPCVOID;
typedef int INT;
typedef unsigned int UINT;
DECLARE_HANDLE (HHOOK);
#ifdef WINABLE
DECLARE_HANDLE (HEVENT);
#endif
#endif
typedef WORD ATOM;
typedef HANDLE NEAR *SPHANDLE;
#endif
#endif /* NO_STRICT */
// Win32 defines _WIN32 automatically,
// but Macintosh doesn't, so if we are using
// Win32 Functions, we must do it here
typedef BOOL near *PBOOL;
typedef BOOL far *LPBOOL;
typedef BYTE near *PBYTE;
typedef BYTE far *LPBYTE;
typedef int near *PINT;
/*
* BASETYPES is defined in ntdef.h if these types are already defined
*/
#ifndef BASETYPES
#define BASETYPES
typedef unsigned long ULONG;
typedef ULONG *PULONG;
/****************************************************************************
* *
#else
typedef int (CALLBACK *FARPROC)();
typedef int (CALLBACK *NEARPROC)();
typedef int (CALLBACK *PROC)();
#endif
#if !defined(_MAC) || !defined(GDI_INTERNAL)
#ifdef _MAC
#ifndef _WIN32
#define _WIN32
#endif
#endif //_MAC
#ifdef __cplusplus
extern "C" {
#endif
#ifndef WINVER
#define WINVER 0x0500
#endif /* WINVER */
typedef HANDLE LOCALHANDLE;
#ifndef _MAC
typedef int (FAR WINAPI *FARPROC)();
typedef int (NEAR WINAPI *NEARPROC)();
typedef int (WINAPI *PROC)();
#define MAX_PATH 260
#ifndef NULL