FAQ of C C 保持更新中

2021-05-24 06:44:06 字數 4001 閱讀 2275

昨天在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()

使用#define 在編譯之前,編譯器用int*替代**中的int_t,所以int_t p1,p2;相當於int* p1,p2;所以p1為指向int型的指標,p2為int型變數。

使用typedef將int*定義為一種型別,叫int_t,所以q1、q2都為指向int型的指標。

定義型別名稱的李逵與李鬼

個人覺得struct和typedef struct二者的區別嘛就是在typedef struct比 struct多做了一件事而已。會怎樣說只是想說二者的主要區別,深究還是偶很多東西的。

6.1要說明區別,舉個例子

typedef struct tagmystruct mystruct;
說明:1.tagmystruct是識別符號 tagmystruct稱為「tag」,即「標籤」,實際上是乙個臨時名字

2.mystruct是變數型別(相當於(char,int等))。

例子做的操作有:

1.定義了乙個新的結構型別:tagmystruct,這個結構型別不是基本的資料型別,而是由char,int組合而成。tagmystruct也只是個標籤而已,

struct tagmystruct
2.再用給這個新的結構型別用typedef起了個新名字叫:mystruct,以後用mystruct就可以定義乙個char的指標和int型別的變數了。 6.2以上是關於結構體定義的,另外關於struct的定義在c和c++中還是有區別的(1)同樣是定義結構體c/c++中有區別,區別是typedef,c中繁瑣之處就是定義結構體型別必要這個。在c中定義乙個結構體型別要用typedef:

typedef struct studentstu;

stu stu1,stu2;

於是在宣告變數的時候就可:stu stu1;(如果沒有typedef就必須用「struct student stu1;」來宣告這裡的stu實際上就是struct student的別名,別名叫stu的變數型別(mystruct),實名是那個struct student。另外這裡也可以不寫student,就是不要那個標籤(tagmystruct)了,因為標籤在不在**,結構體是已經定義了。沒有實名的話,必須別名變數型別(mystruct  )stu來定義了:stu stu1;直接用別名來定義。

typedef structstu; stu stu1,stu2;

於是就定義了結構體型別student,宣告變數時直接student stu2,我覺得可以看成在c++中(2)上個例子只是講c++定義結構體可以不用typedef,但是不是說c++中結構體的定義沒有typedef,有了typedef只是另外一番景象而已。此處例子都在c++

struct   studentstu1;//stu1是乙個變數  

typedef struct student2stu2;//stu2是乙個結構體型別=struct student

要使用的話stu1可以操作了,stu2這個結構體型別要定義乙個實體後才能操作。

stu2 s2;  stu1.name="joechan";

stu1.***="0";

stu1.age=10;

s2.name="joechan";

s2.***="0";

s2.age=10;

VIM 命令(保持更新)

我的原文所在 和 分別是向下和向上搜尋游標所指的詞 豎分屏 vs ctrl w s 橫分屏 sp ctrl w v i或o或a insert 模式,按 esc 回到 normal 模式.備註 i,o和a區別在於i會把游標前移一位,o會帶有回車的效果,a會保持游標位置 a 即shift a 在當前行最...

VIM 命令(保持更新)

和 分別是向下和向上搜尋游標所指的詞 豎分屏 vs ctrl w s 橫分屏 sp ctrl w v i或o或a insert 模式,按 esc 回到 normal 模式.備註 i,o和a區別在於i會把游標前移一位,o會帶有回車的效果,a會保持游標位置 a 即shift a 在當前行最後插入 x 刪...

css常用樣式(保持更新)

注意 class只有高度寬度資訊 方法1 該方法得知道居中元素的寬度 div class box style position relative div class sub box style position absolute top 50 margin top 50px div div 方法2 ...