C++命名空间
- 格式:doc
- 大小:30.00 KB
- 文档页数:4
c++中using的用法
using是C++语言中的一个关键词,它用于引入命名空间或类型别名,方便程序员在代码中使用。
1.引入命名空间:
使用using关键字可以将一个命名空间中的所有成员引入到当
前作用域中,方便程序员在代码中使用这些成员,减少代码的书写量。
例如:
```
#include <iostream>
using namespace std; //引入std命名空间
int main()
{
cout << 'Hello, world!' << endl; //可以直接使用cout,而不需要写成std::cout
return 0;
}
```
2.类型别名:
使用using关键字可以定义类型别名,将一个类型的名称重新定义为另一个名称,方便程序员在代码中使用这个别名。
例如:
```
using int32 = int; //定义int32为int类型的别名
int main()
{
int32 num = 100; //可以使用int32代替int类型
return 0;
}
```
使用using关键字可以使代码更加简洁、易读,提高程序员的编码效率。
但同时也需要注意使用时的命名冲突问题,避免引入多个命名空间导致的命名冲突。
C#命名规范一、类型级单位的命名1、类。
以Class声明的类,都必须以名词或名词短语命名,体现类的作用。
如:Class Indicator当类是一个特性(Attribute)时,以Attribute结尾,当类是一个异常(Exception)时,以Exception结尾:Class ColorSetExceptionClass CauseExceptionAttribute当类只需有一个对象实例(全局对象,比如Application等),必须以Class结尾,如Class ScreenClassClass SystemClass当类只用于作为其他类的基类,根据情况,以Base结尾:MustInherit Class IndicatorBase如果定义的类是一个窗体,那么名字的后面必须加后缀Form,如果是Web窗体,必须加后缀Page:Class PrintForm : Inherits Form '* Windows窗体Class StartPage : Inherits Page '* Web窗体2、枚举和结构同样必须以名词或名词短语命名。
最好体现枚举或结构的特点,如:Enum ColorButtons '以复数结尾,表明这是一个枚举Structure CustomerInfoRecord '以Record结尾,表明这是一个结构体3、委派类型普通的委派类型以描述动作的名词命名,以体现委派类型实例的功能:Delegate Sub DataSeeker (ByVal SeekString As String)用于事件处理的委派类型,必须以EventHandler结尾,如:Delegate Sub DataChangedEventHandler (ByVal Sender As Object, ByVal e As DataChangedEventArgs)4、接口与其他类型不同,接口必须要由I作为前缀,并用形容词命名,突出表现实现接口的类将具有什么能力:Interface ISortable5、模块模块不是类型,他的名称除了必须以名词命名外,必须加以后缀Module: Module SharedFunctionsModule上述所有规则的共同特点是,每个组成名称的词语都必须是大写开头,禁止完全大写或小写的名称。
namespace是什么意思namespace即"命名空间",也称"名称空间" 、"名字空间"。
中的各种语言使用的一种代码组织的形式通过名称空间来分类,区别不同的代码功能同时也是中所有类的完全名称的一部分。
范围所谓namespace,是指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
一:<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
二: 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:1、直接指定标识符。
例如std::ostream而不是ostream。
完整语句如下: std::cout << std::hex << 3.4 << std::endl;2、使用using关键字。
using std::cout; using std::endl; using std::cin; 以上程序可以写成cout << std::hex << 3.4 << endl;3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。
C#之命名空间关键字:namespace、usingnamespace 关键字⽤于声明⼀个范围。
此命名空间范围允许您组织代码并为您提供了创建全局唯⼀类型的⽅法:命名空间名可以是任何合法的标识符。
命名空间名可以包含句号。
即使未显式声明命名空间,也会创建默认命名空间。
该未命名的命名空间(有时称为全局命名空间)存在于每⼀个⽂件中。
全局命名空间中的任何标识符都可⽤于命名的命名空间中。
命名空间隐式具有公共访问权,并且这是不可修改的。
namespacenamespace 关键字⽤于声明⼀个范围。
此命名空间范围允许您组织代码并为您提供了创建全局唯⼀类型的⽅法:命名空间名可以是任何合法的标识符。
命名空间名可以包含句号。
即使未显式声明命名空间,也会创建默认命名空间。
该未命名的命名空间(有时称为全局命名空间)存在于每⼀个⽂件中。
全局命名空间中的任何标识符都可⽤于命名的命名空间中。
命名空间隐式具有公共访问权,并且这是不可修改的。
在两个或更多的声明中定义⼀个命名空间是可以的。
如在同⼀个⽂件中分别将两个类定义为 MyCompany 命名空间的⼀部分:// keywords_namespace.csnamespace Hunts.Test{class MyClass1{//}}namespace Hunts.Test{class MyClass2{//}}⽰例:(略)usingusing 关键字有两个主要⽤途:作为指令,⽤于为命名空间创建别名或导⼊其他命名空间中定义的类型。
using namespace;using alias = type|namespace;// Type:您想通过 alias 表⽰的类型。
这种做法可以⽤于处理在同时引⽤包含了相同名称的类的命名空间,并需要使⽤⽽引发的冲突。
(见⽰例1)// namespace:您想通过 alias 表⽰的命名空间。
或者是⼀个命名空间,它包含您想在⽆需指定完全限定名的情况下使⽤的类型。
C#命名空间(namespace)不可不知的那些事 命名空间本质上就是⼀个逻辑分组,就和我们⽂件夹分组是⼀致的,允许我们将相关的类型集合在⼀起。
命名空间是⼀个⽐较通⽤的概念,在很多语⾔⾥⾯都存在,只不过可能存在⼀些细微差别以及使⽤不同的名称。
⽐如Java就叫包(package)。
接下来,我们将从以下五个⽅⾯来讲解命名空间: 定义命名空间使⽤命名空间正确理解命名空间含义使⽤命名空间alias解决简单类名冲突使⽤extern alias解决Assembly中的完整类名冲突定义命名空间 命名空间的定义很简单,是以关键字namespace(命名空间的英⽂名)开始,后跟命名空间的名字和⼀对⼤括号。
⼤括号⾥的内容都属于这个命名空间。
格式如下: namespace namespace_name { } namespace_name是以点号(.)作为层级隔离的。
⽐如System.IO就可以认为System是第⼀层命名空间,IO是第⼆层命名空间。
由于命名空间其实就是⼀个逻辑分组,所以namespace这个关键字,我们可以理解为“如果不存在namespace_name这个命名空间,就创建⼀个。
如果存在,就使⽤这个命名空间”。
因此,我们是可以在多个地⽅定义同⼀个命名空间的,只要保证同⼀个命名空间中的内容不冲突即可,如下: namespace System.IO { class MemoryStream {} } namespace System.IO { class BufferedStream {} }使⽤命名空间 在程序中使⽤特定类型的时候,我们需要使⽤完整的限定名,⽐如System.IO.MemoryStream。
但是如果每次都这么写,除了增加了开发⼈员打字的成本,毫⽆益处。
因此我们可以使⽤using关键字来表明我们需要使⽤某个命名空间中的类型。
如下: //使⽤完整限定名 public static void Main() { System.Text.StringBuilder sb=new System.Text.StringBuilder(); } //使⽤using 关键字 using System.Text; public static void Main() { StringBuilder sb=new StringBuilder(); } using关键字,其实是告诉编译器可以尝试在这个特定的命名空间中查找类型。
9. 名称空间9.1 编译单元9.2 名称空间声明9.3 使用指示9.3.1 使用别名指示9.3.2 使用名称空间指示9.4 名称空间成员9.5 类型声明C#程序用名称空间来组织。
名称空间用在程序的“内部”组织系统,也用在“外部”组织系统-一种表现输出到其他程序的程序元素。
使用指示使得使用名称空间变得非常容易。
9.1 编译单元一个编译单元定义了一个源文件全部的结构。
一个编译单元由没有或多个后面跟着没有或多个名称空间成员声明的使用指示组成。
compilation-unit: using-directivesoptnamespace-member-declarationsopt一个C#程序包括一个或多个编译单元,每个都包含在分立的源文件中。
当C#程序被编译,所有的编译单元都一起处理。
这样,编译单元可以互相依靠,有可能出现循环的形式。
编译单元的使用指示影响那个编译单元的名称空间成员声明,但是不会对其他编译单元有影响。
一个程序的每个编译单元的名称空间成员声明把成员放到一个单独的声明域中,称为全局名称空间。
例如:File A.cs:class A {}File B.cs:class B {}两个编译单元合成一个单独的全局名称空间,在这种情况下声明了两个有完全名称的A和B。
因为两个编译单元指向同一个声明域,如果每个都包含一个有相同名称的成员的声明就会产生错误。
9.2 名称空间声明一个名称空间声明由关键词namespace,跟着一个名称空间名称和主体,最后有一个可选的分号组成。
namespace-declaration: namespace qualified-identifiernamespace-body ;optqualified-identifier: identifier qualified-identifier . identifiernamespace-body: { using-directivesoptnamespace-member-declarations}opt一个名称空间声明也许会在编译单元中作为最高级别的声明发生,或者在另一个名称空间声明中作为一个成员声明。
用法三则C# UsingC#关键字的用法不单只有一种方法的。
现在我总结了一下Using和New的用法,顺便也是为了帮助大家更好的理解C# using用法。
Using(1)引用命名空间using作为引入命名空间指令的用法规则为:using Namespace;在.NET程序中,最常见的代码莫过于在程序文件的开头引入System命名空间,其原因在于System命名空间中封装了很多最基本最常用的操作,下面的代码对我们来说最为熟悉不过:using System;这样,我们在程序中就可以直接使用命名空间中的类型,而不必指定详细的类型名称。
using 指令可以访问嵌套命名空间。
关于:命名空间命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式。
例如,在.NET中很多的基本类型都位于System命名空间,数据操作类型位于System.Data命名空间,(2)创建命名空间别名using为命名空间创建别名的用法规则为:using alias = namespace | type;其中namespace表示创建命名空间的别名;而type表示创建类型别名。
例如,在.NET Office 应用中,常常会引入Microsoft.Office.Interop.Word.dll程序集,在引入命名空间时为了避免繁琐的类型输入,我们通常为其创建别名如下:using MSWord = Microsoft.Office.Interop.Word;这样,就可以在程序中以MSWord来代替Microsoft.Office.Interop.Word前缀,如果要创建Application对象,则可以是这样,而且还有一个好处就是,在一个.CS文件中引入了不同的命名空间但是相同的类名的时候,用别名就可以解决这问题了。
(3)强制资源清理用途:清理非托管资源,不受GC控制的资源。
命名规范_C(Sharp)1.命名规范a)类【规则1-1】使用Pascal规则命名类名,即首字母要大写。
【规则1-2】使用能够反映类功能的名词或名词短语命名类。
【规则1-3】不要使用“I”、“C”、“_”等特定含义前缀。
【规则1-4】自定义异常类应以Exception结尾。
【规则1-5】文件名要能反映类的内容,最好是和类同名。
b)类字段【规则2-1】用camel规则来命名类成员变量名称,即首单词(或单词缩写)小写。
【规则2-2】类字段变量名前可加“_”前缀。
【规则2-3】坚决禁止在普通变量前加“m_”(这是VC老命名规则)。
c)方法【规则3-1】方法名采用Pascal规则,第一个字符要大写。
【规则3-2】方法名应使用动词或动词短语。
【规则3-3】类中访问修饰符或功能相同的方法应该放在一起,且公共或实现接口的方法在前。
d)属性【规则4-1】使用名词定义属性,属性使用Pascal规则,首字符大写。
【规则4-2】属性和相应字段名称要关联,可以使用“重构”菜单来生成属性。
e)参数【规则5-1】参数采用camel规则命名,且首字符小写。
【规则5-2】使用描述性参数名称,参数名称应当具有最够的说明性。
【规则5-3】不要给参数加匈牙利语类型表示法的前缀。
【规则5-4】检查方法所有输入参数的有效性。
f)常量【规则6-1】只读常量使用Pascal命名规则,即首字母大写。
【规则6-2】枚举名使用Pascal规则命名,枚举成员本质属于常量,命名规则同上。
【规则6-3】枚举值从小到大顺序定义。
【规则6-4】静态字段或属性采用Pascal规则,即首字符大写。
g)接口【规则7-1】接口定义使用Pascal规则,且必须以大写“I”开头。
【规则7-2】接口名称要有意义,中间不要有下划线“_”等字符。
【规则7-3】如果类实现了接口,名称尽量和接口相同,只是省掉“I”字符。
h)事件【规则8-1】委托名称采用Pascal规则,即首字符大写。
C命名空间namespace的作用和使用解析一、为什么需要命名空间(问题提出)命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
在 C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。
C++又引入了类作用域,类是出现在文件内的。
在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。
1、全局变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体(enuty),包括变量、函数和类等。
例:如果在文件中定义了两个类,在这两个类中可以有同名的函数。
在引用时,为了区别,应该加上类名作为限定:class A //声明A类{ public:void funl();//声明A类中的funl函数private:int i; };void A::funl() //定义A类中的funl函数{…………}class B //声明B类{ public: void funl(); //B类中也有funl函数 void fun2(); };void B::funl() //定义B类中的funl函数{ …………}这样不会发生混淆。
在文件中可以定义全局变量(global variable),它的作用域是整个程序。
如果在文件A中定义了一个变量a int a=3;在文件B中可以再定义一个变量a int a=5;在分别对文件A和文件B进行编译时不会有问题。
但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。
可以通过extern声明同一程序中的两个文件中的同名变量是同一个变量。
如果在文件B中有以下声明:extem int a;表示文件B中的变量a是在其他文件中已定义的变量。
由于有此声明,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。
如果在文件B中不再对a赋值,则在文件B中用以下语句输出的是文件A中变量a的值: cout<二、什么是命名空间(解决方案)命名空间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。
C++namespace用法详细介绍_程序员草帽的博客-CSDN博客编写程序过程中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。
工程越大,名称互相冲突性的可能性越大。
另外使用多个厂商的类库时,也可能导致名称冲突。
为了避免,在大规模程序的设计中,以及在程序员使用各种各样的 C++ 库时,这些标识符的命名发生冲突,标准C++ 引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。
例如,我们在 C 语言中,通过 static 可以限制名字只在当前编译单元内可见,在 C++ 中我们通过 namespace 来控制对名字的访问。
1. namespace 语法1. namespace 中可定义常量、变量、函数、结构体、枚举、类等2. namespace 只能在全局定义。
3. namespace 支持嵌套定义。
4. namespace 是开放的,可随时添加新的成员。
5. namespace 关键字可以为已有空间名字增加别名6. 无名命名空间意味着命名空间中的符号只能在本文件中访问,相当于给符号增加了 static 修饰。
推荐了解1.1 namespace 可包含的成员1.2 namespace 只能在全局定义1.3 namespace 支持嵌套定义名字空间 my_space 中可以嵌套定义子名字空间 my_sub_space.1.4 namespace 是开放的,随时可添加成员1.5 namespace 为已有空间名字创建别名1.6 namespace 匿名名字空间无名命名空间意味着命名空间中的符号只能在本文件中访问,相当于给符号增加了 static 修饰,只能在当前文件内访问。
2. 使用 namespace 中符号使用名字空间中定义的符号有三种方式:1. 直接通过 namespace 作用域访问2. using 声明指定某个符号在某个作用域下可见3. using 编译指令指定名字空间中所有符号在在某个作用域下可见2.1 直接访问2.2 using 声明using 声明指定某个符号在某个作用域下可见。
C#反射总结获取命名空间类名⽅法名⼀、获取命名空间类名⽅法名using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Diagnostics;using System.Reflection;namespace GetMethodNameSpace{class Program{public static string GetMethodInfo(){string str = "";//取得当前⽅法命名空间str += "命名空间名:" + System.Reflection.MethodBase.GetCurrentMethod()space + "\n";//取得当前⽅法类全名str += "类名:" + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "\n";//取得当前⽅法名str += "⽅法名:" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\n";str += "\n";StackTrace ss = new StackTrace(true);MethodBase mb = ss.GetFrame(1).GetMethod();//取得⽗⽅法命名空间str += space + "\n";//取得⽗⽅法类名str += + "\n";//取得⽗⽅法类全名str += mb.DeclaringType.FullName + "\n";//取得⽗⽅法名str += + "\n";return str;}public static void Main(){Console.WriteLine(GetMethodInfo());Console.ReadKey();}}}⼆、利⽤反射动态加载dll头部引⽤加:using System.Reflection;Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+ "/DeclareDLL/YunDouTaxLib.dll");////我们要调⽤的dll⽂件路径//加载dll后,需要使⽤dll中某类.Type t = asm.GetType("namespace.classname");//获取类名,必须命名空间+类名//实例化类型object o = Activator.CreateInstance(t);//得到要调⽤的某类型的⽅法MethodInfo method = t.GetMethod("functionname");//functionname:⽅法名字object[] obj ={Parameters[0].TaxpayerName,Parameters[0].TaxpayerTaxCode,Parameters[0].CAPassword};//对⽅法进⾏调⽤var keyData = method.Invoke(o, obj);//param为⽅法参数object数组三,没有Assembly.LoadFrom 需要在程序中加引⽤。
C语⾔中的字符(char)详细讲解1.字符型(char)简介字符型(char)⽤于储存字符(character),如英⽂字母或标点。
严格来说,char 其实也是整数类型(integer type),因为 char 类型储存的实际上是整数,⽽不是字符。
计算机使⽤特定的整数编码来表⽰特定的字符。
2. 声明字符型变量3. 字符常量与初始化实例:⽤ char 类型来专门表⽰⼀个字符,例如:char a='1';char b='$';char c='X';char d=' '; // 空格也是⼀个字符char e='\63'; //也可以使⽤转义字符的形式char 称为字符类型,只能⽤单引号' '来包围,不能⽤双引号" "包围。
⽽字符串只能⽤双引号" "包围,不能⽤单引号' '包围。
输出字符使⽤ %c,输出字符串使⽤ %s。
字符与整数先看下⾯⼀段代码:#include <stdio.h>#include <stdlib.h>int main(){char a = 'E';char b = 70;int c = 71;int d = 'H';printf("a=%c, a=%d\n", a, a);printf("b=%c, b=%d\n", b, b);printf("c=%c, c=%d\n", c, c);printf("d=%c, d=%d\n", d, d);system("pause");return 0;}输出结果:a=E, a=69b=F, b=70c=G, c=71d=H, d=72在ASCII码表中,E、F、G、H 的值分别是 69、70、71、72。
c名词解释命名空间解释
C是一种通用的编程语言,由Dennis Ritchie在20世纪70年
代开发。
它是一种高级编程语言,广泛应用于系统软件开发、嵌入
式系统和高性能计算等领域。
C语言具有简洁、高效、可移植等特点,被广泛认为是一种高效的编程语言。
在C语言中,命名空间是一种用于组织和管理标识符(如变量、函数、结构体等)的机制。
命名空间的主要目的是避免不同模块之
间的标识符冲突,提高代码的可维护性和可重用性。
在C语言中,命名空间通过使用前缀来区分不同的标识符。
通
过给标识符添加前缀,可以将其限定在特定的命名空间中,避免与
其他命名空间中的标识符冲突。
例如,如果有两个模块都定义了一
个名为"count"的变量,可以通过给它们分别添加前缀来区分它们,如"module1_count"和"module2_count"。
命名空间的使用可以提高代码的可读性和可理解性。
它可以帮
助开发人员更好地组织和管理代码,减少命名冲突的可能性,并且
使代码更易于维护和扩展。
总结起来,C语言是一种通用的编程语言,命名空间是一种用于组织和管理标识符的机制,通过给标识符添加前缀来区分不同的命名空间,提高代码的可维护性和可重用性。
c中using的用法c中using的用法的用法你知道吗?下面小编就跟你们详细介绍下c中using的用法的用法,希望对你们有用。
c中using的用法的用法如下:using 关键字有两个主要用途:作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。
请参见 using 指令。
作为语句,用于定义一个范围,在此范围的末尾将释放对象。
请参见 using 语句。
好了我们看到了MSDN给了我们答案,其中using只要有两种用法一种是指令、另一种是语句。
那我们从指令开始吧,而在MSDN中指令又有两种用法1.允许在命名空间中使用类型,这样,您就不必在该命名空间中限定某个类型的使用:using System.Text;2为命名空间或类型创建别名。
using Project = PC.MyCompany.Project;(1.1)第一种我们在熟悉不过了,但是你知道vs的编译过程吗。
当我们创建一个控制台应用程序,系统为我们生成了很多个默认的using空间。
例如:1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;但是当我们写一个hello world 程序的时候,真正用到的只有using System这个空间。
可能你会说那我们引用这么多空间干嘛,不会占用资源吗?这里我来告诉你答案。
虽然我们引用了很多多余的空间但是我们的vs却帮我们在内存中引用了它需要的那些。
当然从我们角度看,有没有办法去掉那些我们不需要的命名空间呢?这里我告诉你一种办法。
当我们做好整个项目的时候我们在using的区域内右击-----组织using------移除和排序,这样就可以去掉那些不需要的了。
(1.2)为命名空间或类型创建别名。
这个用到的不是很多,但是讲到了那我们就详细点。
当我们在一个命名空间内调用一个类的时候,没有有问题的。
c语言结构体命名规则C语言结构体命名规则在C语言中,结构体是一种自定义的数据类型,它可以包含多个不同类型的数据成员,方便程序员进行数据的组织和管理。
在使用结构体时,命名规则是非常重要的,良好的命名规则可以提高代码的可读性和可维护性。
本文将从不同的角度介绍C语言结构体的命名规则。
1. 结构体名称结构体名称应该具有描述性,能够清晰地表达结构体的含义。
通常情况下,结构体名称应该是一个名词,而不是一个动词。
例如,一个表示学生信息的结构体可以命名为“Student”,而不是“GetStudent”。
2. 结构体成员名称结构体成员名称应该具有描述性,能够清晰地表达成员的含义。
通常情况下,成员名称应该是一个名词,而不是一个动词。
例如,一个表示学生信息的结构体中,成员“name”表示学生的姓名,成员“age”表示学生的年龄。
3. 结构体成员命名规则结构体成员的命名规则应该遵循以下原则:(1)成员名称应该以小写字母开头,不应该使用大写字母或下划线。
(2)成员名称应该使用驼峰命名法,即第一个单词的首字母小写,后面的单词首字母大写。
例如,成员“studentName”表示学生的姓名。
(3)成员名称应该具有描述性,能够清晰地表达成员的含义。
例如,成员“studentAge”表示学生的年龄。
4. 结构体成员顺序结构体成员的顺序应该按照从大到小的顺序排列,即从占用内存空间最大的成员开始,到占用内存空间最小的成员结束。
这样可以减少内存空间的浪费,提高程序的效率。
5. 结构体命名空间结构体命名空间是指结构体名称和结构体成员名称之间的命名空间。
为了避免命名冲突,结构体命名空间应该尽可能地独立。
通常情况下,可以在结构体名称前加上一个前缀,例如“stu_Student”表示学生信息的结构体。
总之,良好的命名规则可以提高代码的可读性和可维护性,使程序更加易于理解和修改。
在使用C语言结构体时,应该遵循以上命名规则,以便于其他程序员能够轻松地理解和使用代码。
C语言命名空间详解C语言命名空间分析准则:1、在同一命名空间、相同作用域中,任何名字须具有唯一性2、每个结构和联合内部都有自己的命名空间(独立于其他空间)3、结构标签、联合标签、枚举标签共用一个命名空间(独立于其他空间)4、goto使用的标签名,只要在同一函数内部唯一(独立于其他空间)5、所有其他情况共用一个命名空间,如变量、所有枚举常量、typedef定义的别名等(独立于其他空间)6、#define宏有点特殊,宏覆盖所有命名空间,所有和宏同名的在预处理时都会被替换为宏,只要替换后没有语法错误,这种替换就在神不知鬼不觉中进行。
一个能够完整说明问题的例子#include<malloc.h>#include<stdio.h>//可以开关这个宏定义//并用gcc -E main.c -o main.i来看宏的效果//#define msg hahastruct msg //【结构标签命名空间】{int msg; //【结构内部的命名空间】,只需在结构内部唯一即可};union u_msg //【联合标签命名空间】和结构、枚举标签共用一个命名空间,故这里//不能再用msg或e_msg{int msg; //联合内部的命名空间,只需在联合内部唯一即可};//【其他命名空间】int msg; //这里可以用msg,只要【其他命名空间】中唯一即可typedef unsigned int uint;enum e_msg //【枚举标签命名空间】和结构、联合标签共用一个命名空间,故这里//不能再用msg或u_msg{zero = 0, //枚举常量也属于【其他命名空间】部分one,two,};void func(void)msg: //【标签名命名空间】,只要在函数内部唯一即可return;}int main(int argc, char *argv[]){struct msg //较小作用域覆盖全局作用域的定义{char *msg;}msg;enum e_msg{zero = 0,one,five,};msg: //标签名命名空间,只要在函数内部唯一即可return 0;}当打开#define msg haha宏定义后,查看经预处理后源码文件main.i最后部分大致如下:struct haha{int haha;};union u_msg{int haha;};int haha;typedef unsigned int uint;enum e_msg{zero = 0,one,two,};void func(void)haha:return;}int main(int argc, char *argv[]){struct haha{char *haha;}haha;enum e_msg{zero = 0,one,five,};haha:return 0;}可见预处理器把所有与宏相同的符号都进行了文本替换,只要替换后没有语法错误,就能通过编译。
C++命名空间namespace
虽然使用命名空间的方法,有多种可供选择。
但是不能贪图方便,一味使用using 指令,这样就完全背离了设计命名空间的初衷,也失去了命名空间应该具有的防止名称冲突的功能。
一般情况下,对偶尔使用的命名空间成员,应该使用命名空间的作用域解析运算符来直接给名称定位。
而对一个大命名空间中的经常要使用的少数几个成员,提倡使用using声明,而不应该使用using编译指令。
只有需要反复使用同一个命名空间的许多数成员时,使用using编译指令,才被认为是可取的。
例如,如果一个程序(如上面的outi.cpp)只使用一两次cout,而且也不使用std命名空间中的其他成员,则可以使用命名空间的作用域解析运算符来直接定位。
如:
#include <iostream>
……
std::cout << "Hello, World!" << std::endl;
std::cout << "Outer::i = " << Outer::i << ", Inner::i = " << Outer::Inner::i << std::endl;
又例如,如果一个程序要反复使用std命名空间中的cin、cout 和cerr(如上面的outi.cpp),而不怎么使用其他std命名空间中的其他成员,则应该使用using 声明而不是using指令。
如:
#include <iostream>
……
using std::cout;
cout << "Hello, World!" << endl;
cout << "Outer::i = " << Outer::i << ", Inner::i = " << Outer::Inner::i << endl;
4)命名空间的名称
<!--[if !supportLists]-->l <!--[endif]-->命名空间别名
标准C++引入命名空间,主要是为了避免成员的名称冲突。
若果用户都给自己的命名空间取简短的名称,那么这些(往往同是全局级的)命名空间本身,也可能发生名称冲突。
如果为了避免冲突,而为命名空间取很长的名称,则使用起来就会不方便。
这是一个典型的两难问题。
标准C++为此提供了一种解决方案——命名空间别名,格式为:namespace 别名= 命名空间名;
例如:(AT&T美国电话电报公司)
namespace American_Telephone_and_Telegraph { // 命名空间名太长
class String {
String(const char*);
// ……
}
}
American_Telephone_and_Telegraph::String s1 // 使用不方便
= new American_Telephone_and_Telegraph::String("Grieg");
namespace ATT = American_Telephone_and_Telegraph; // 定义别名
ATT::String s2 = new ATT::String("Bush"); // 使用方便ATT::String s3 = new ATT::String("Nielsen");
<!--[if !supportLists]-->l <!--[endif]-->无名命名空间
标准C++引入命名空间,除了可以避免成员的名称发生冲突之外,还可以使代码保持局部性,从而保护代码不被他人非法使用。
如果你的目的主要是后者,而且又为替命名空间取一个好听、有意义、且与别人的命名空间不重名的名称而烦恼的话,标准C++还允许你定义一个无名命名空间。
你可以在当前编译单元中(无名命名空间之外),直接使用无名命名空间中的成员名称,但是在当前编译单元之外,它又是不可见的。
无名命名空间的定义格式为:
namespace {
声明序列可选
}
实际上,上面的定义等价于:(标准C++中有一个隐含的使用指令)
namespace $$$ {
声明序列可选
}
using namespace $$$;
例如:
namespace {
int i;
void f() {/*……*/}
}
int main() {
i = 0; // 可直接使用无名命名空间中的成员i
f(); // 可直接使用无名命名空间中的成员f()
}。