昨天在http://topic.csdn.net/u/20090302/18/4320513c-c749-42bd-8922-b96c00b5a2b4.html上看到不少FAQ,最近也在看ucos和uc_gui的移植
在实现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。所以重复引用了
C语言\r\n和\n区别
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。
#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; ... }
定义类型名称的李逵与李鬼
个人觉得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;