FAQ of C/C++ (保持更新中....)

昨天在http://topic.csdn.net/u/20090302/18/4320513c-c749-42bd-8922-b96c00b5a2b4.html上看到不少FAQ,最近也在看ucos和uc_gui的移植

 

【1. already defined in *.obj】

在实现DES加密解密时,出现了这个问题,主要是一些数组定义出错。

error LNK2005: _MOVE_TIMES already defined in PrintTest.obj
test3.obj : error LNK2005: _PC_2 already defined in PrintTest.obj
test3.obj : error LNK2005: _PC_1 already defined in PrintTest.obj
test3.obj : error LNK2005: _S already defined in PrintTest.obj
test3.obj : error LNK2005: _P_Table already defined in PrintTest.obj
test3.obj : error LNK2005: _E_Table already defined in PrintTest.obj

 

……

图片如下

 


解决办法:把原来在DES.h中的数定义移到DES.C中,原来我在include.h中加入了DES.H,在DES.C中预处理中用了DES.H,在主函数main()所在的文件TEST3.C中预处理引用了include.h。所以重复引用了

【2. \r\n 和\r 的区别】

C语言\r\n和\n区别

【3. const 和define 定义常量的区别】

const 和defin作用很多此处仅说明一下二者在定义常量时候的区别。

(1)区别

define宏定义的常量是一种纯粹的置换关系【数据类型】它没有固定数据类型。编译器会给出类型自动匹配【优点】方便程序修改;提高程序运行效率。

编译器会给出类型自动匹配

#define foo 5
unsigned int bar=5;
if ( bar==foo ) {...}// 编译器会把foo宏自动设置为unsigned int类型
if ( 5==foo )    { ... }               // 编译器会把foo宏自动设置为int类型

十足的无形胜有形

const  是一个C语言的关键字,它限定一个变量不允许被改变【数据类型】定义的常量具有数据类型特征【优点】一定程度上提高了程序的安全性可靠性;

const限定不可变的内容是什么?

  1)const在前面

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const char* const pContent; //pContent和*pContent都是const

2)const在后面,与上面的声明对等

int const nValue; //nValue是const
char const * pContent; //*pContent是const, pContent可变
char* const pContent; //pContent是const,*pContent可变
char const* const pContent; //pContent和*pContent都是const

(2)选择

1). 修改常量时,const能减少软件的重编译时间,只需要重编译变量值改动的一个文件;而define需要编译所有使用这个宏的文件。

2). const把常量放入已初始化的只读数据区,define把常量编译进代码区,从代码、数据分离的角度,需要使用const。


【4.宏与声明:#define & typedef区别】

 #define     在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
  typedef     声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。

举个例子,随便复习一下指针

#define INT_T int*  
typedef int* int_t;  
void main(){  
       INT_T p1,p2;  
       int_t q1,q2; 
       ...
}

使用#define 在编译之前,编译器用int*替代代码中的INT_T,所以INT_T p1,p2;相当于int* p1,p2;所以p1为指向int型的指针,p2为int型变量。
使用typedef将int*定义为一种类型,叫int_t,所以q1、q2都为指向int型的指针。

【5.typedef和typeof】

定义类型名称的李逵与李鬼

【6.struct和typedef struct 的区别】

个人觉得struct和typedef struct二者的区别嘛就是在typedef struct比 struct多做了一件事而已。会怎样说只是想说二者的主要区别,深究还是偶很多东西的。

6.1要说明区别,举个例子

typedef struct tagMyStruct{ 
    	char *pchVar;
	int iFoo;
} MyStruct;

说明:1.tagMyStruct是标识符 tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字

  2.MyStruct是变量类型(相当于(char,int等))。

例子做的操作有:

1.定义了一个新的结构类型:tagMyStruct,这个结构类型不是基本的数据类型,而是由char,int组合而成。tagMyStruct也只是个标签而已,

struct tagMyStruct{     
 char *pchVar; 
 int iFoo;
} 

2.再用给这个新的结构类型用typedef起了个新名字叫:MyStruct,以后用MyStruct就可以定义一个char的指针和int类型的变量了。 6.2以上是关于结构体定义的,另外关于Struct的定义在C和C++中还是有区别的(1)同样是定义结构体C/C++中有区别,区别是typedef,C中繁琐之处就是定义结构体类型必要这个。在C中定义一个结构体类型要用typedef:

typedef struct Student{
 char  name[10];
 char  sex;
 int   age;
}Stu;
Stu stu1,stu2;


于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用“struct Student stu1;”来声明这里的Stu实际上就是struct Student的别名,别名叫Stu的变量类型(MyStruct),实名是那个struct Student。另外这里也可以不写Student,就是不要那个标签(tagMyStruct)了,因为标签在不在哪里,结构体是已经定义了。没有实名的话,必须别名变量类型(MyStruct  )Stu来定义了:Stu stu1;直接用别名来定义。

 typedef struct{
char  name[10];
 char  sex;
 int   age;             
}Stu; Stu stu1,stu2;  



 于是就定义了结构体类型Student,声明变量时直接Student stu2,我觉得可以看成在C++中(2)上个例子只是讲C++定义结构体可以不用typedef,但是不是说C++中结构体的定义没有typedef,有了typedef只是另外一番景象而已。此处例子都在C++

struct   Student{   

 char  name[10];
 char  sex;
 int   age;  
}stu1;//stu1是一个变量  

typedef   struct   Student2{   
 char  name[10];
 char  sex;
 int   age;   
}stu2;//stu2是一个结构体类型=struct Student

 要使用的话stu1可以操作了,stu2这个结构体类型要定义一个实体后才能操作。

  stu2 s2;  stu1.name="JoeChan";
  stu1.sex="0";
  stu1.age=10;
            
  s2.name="JoeChan";
  s2.sex="0";
  s2.age=10;  



 

 

 

你可能感兴趣的:(FAQ of C/C++ (保持更新中....))