第一章 C語(yǔ)言概述
1.1 什么是C語(yǔ)言
一提到語(yǔ)言這個(gè)詞語(yǔ)机隙,自然會(huì)想到的是像英語(yǔ)盗誊、漢語(yǔ)等這樣的自然語(yǔ)言澄峰,因?yàn)樗侨撕腿私粨Q信息不可缺少的工具朱巨。
而今天計(jì)算機(jī)遍布了我們生活的每一個(gè)角落他嫡,除了人和人的相互交流之外,我們必須和計(jì)算機(jī)角落备籽。
用什么的什么樣的方式和計(jì)算機(jī)做最直接的交流呢?人們自然想到的是最古老也最方便的方式——語(yǔ)言分井,而C語(yǔ)言就是人和計(jì)算機(jī)交流的一種語(yǔ)言车猬。
語(yǔ)言是用來(lái)交流溝通的。有一方說(shuō)尺锚,有另一方聽(tīng)珠闰,必須有兩方參與,這是語(yǔ)言最重要的功能:
- 說(shuō)的一方傳遞信息瘫辩,聽(tīng)的一方接收信息伏嗜;
- 說(shuō)的一方下達(dá)指令,聽(tīng)的一方遵循命令做事情伐厌。
語(yǔ)言是人和人交流承绸,C語(yǔ)言是人和機(jī)器交流。只是挣轨,人可以不聽(tīng)另外一個(gè)人军熏,但是,計(jì)算機(jī)是無(wú)條件服從卷扮。
語(yǔ)言有獨(dú)特的語(yǔ)法規(guī)則和定義荡澎,雙方必須遵循這些規(guī)則和定義才能實(shí)現(xiàn)真正的交流。
1.2 計(jì)算機(jī)介紹
1.2.1 計(jì)算機(jī)結(jié)構(gòu)組成
1.2.2 計(jì)算機(jī)系統(tǒng)組成
1.2.3 程序和指令
- 指令是對(duì)計(jì)算機(jī)進(jìn)行程序控制的最小單位晤锹。
- 所有的指令的集合稱為計(jì)算機(jī)的指令系統(tǒng)摩幔。
-
程序是為完成一項(xiàng)特定任務(wù)而用某種語(yǔ)言編寫的一組指令序列。
1.3 語(yǔ)言發(fā)展歷程
1.3.1 機(jī)器語(yǔ)言
計(jì)算機(jī)的大腦或者說(shuō)心臟就是CPU鞭铆,它控制著整個(gè)計(jì)算機(jī)的運(yùn)作或衡。每種CPU,都有自己的指令系統(tǒng)衔彻。這個(gè)指令系統(tǒng)薇宠,就是該CPU的機(jī)器語(yǔ)言。
機(jī)器語(yǔ)言是一組由0和1系列組成的指令碼艰额,這些指令碼澄港,是CPU制作廠商規(guī)定出來(lái)的,然后發(fā)布出來(lái)柄沮,請(qǐng)程序員遵守回梧。
要讓計(jì)算機(jī)干活废岂,就得用機(jī)器語(yǔ)言(二級(jí)制數(shù))去命令它。這樣的命令狱意,不是一條兩條湖苞,而是上百條。而且不同型號(hào)的計(jì)算機(jī)其機(jī)器語(yǔ)言是不相通的详囤,按著一種計(jì)算機(jī)的機(jī)器指令編制的程序财骨,不能在另一種計(jì)算機(jī)上執(zhí)行。
1.3.2 匯編語(yǔ)言和編譯器
機(jī)器語(yǔ)言編程是不是很令人煩惱呢藏姐,終于出現(xiàn)了匯編語(yǔ)言隆箩,就是一些標(biāo)識(shí)符取代0與1。一門人類可以比較輕松認(rèn)識(shí)的編程語(yǔ)言羔杨。
只是這門語(yǔ)言計(jì)算機(jī)并不認(rèn)識(shí)捌臊,所以人類還不能用這門語(yǔ)言命令計(jì)算機(jī)做事情。這正如如何才能讓中國(guó)人說(shuō)的話美國(guó)人明白呢兜材?——翻譯理澎!
所以,有一類專門的程序曙寡,既認(rèn)識(shí)機(jī)器語(yǔ)言糠爬,又認(rèn)識(shí)匯編語(yǔ)言,也就是編譯器卵皂,將標(biāo)識(shí)符換成0與1秩铆,知道怎么把匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言。
1.3.3 高級(jí)語(yǔ)言
匯編語(yǔ)言和機(jī)器語(yǔ)言都是面向機(jī)器的灯变,機(jī)器不同殴玛,語(yǔ)言也不同。既然有辦法讓匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言添祸,難道就不能把其他更人性化的語(yǔ)言翻譯成機(jī)器語(yǔ)言滚粟?
1954年,F(xiàn)ortran語(yǔ)言出現(xiàn)了刃泌,其后相繼出現(xiàn)了其他的類似語(yǔ)言凡壤。這批語(yǔ)言,使程序員擺脫了計(jì)算機(jī)硬件的限制耙替,把主要精力放在了程序設(shè)計(jì)上亚侠,不在關(guān)注低層的計(jì)算機(jī)硬件。這類語(yǔ)言俗扇,稱為高級(jí)語(yǔ)言硝烂。
同樣的,高級(jí)語(yǔ)言要被計(jì)算機(jī)執(zhí)行铜幽,也需要一個(gè)翻譯程序?qū)⑵浞g成機(jī)器語(yǔ)言滞谢,這就是編譯程序串稀,簡(jiǎn)稱編譯器。
這類高級(jí)語(yǔ)言解決問(wèn)題的方法是分析出解決問(wèn)題所需要的步驟狮杨,把程序看作是數(shù)據(jù)被加工的過(guò)程母截。基于這類方法的程序設(shè)計(jì)語(yǔ)言成為面向過(guò)程的語(yǔ)言橄教。C語(yǔ)言就是這種面向過(guò)程的程序設(shè)計(jì)語(yǔ)言清寇。
1.3.4 語(yǔ)言的層次
1.3.5 語(yǔ)言進(jìn)化史
1.4 為什么要學(xué)習(xí)C語(yǔ)言
1.4.1 C語(yǔ)言特點(diǎn)
- 優(yōu)點(diǎn)
- 代碼量小
- 執(zhí)行速度快
- 功能強(qiáng)大
- 編程自由
- 缺點(diǎn)
- 寫代碼實(shí)現(xiàn)周期長(zhǎng)
- 可移植性較差
- 過(guò)于自由,經(jīng)驗(yàn)不足易出錯(cuò)
- 對(duì)平臺(tái)庫(kù)依賴較多
1.4.2 學(xué)習(xí)C語(yǔ)言理由
1.4.3 C語(yǔ)言應(yīng)用領(lǐng)域
C語(yǔ)言的應(yīng)用極其廣泛颤陶,從網(wǎng)站后臺(tái)颗管,到底層操作系統(tǒng),從多媒體應(yīng)用到大型網(wǎng)絡(luò)游戲滓走,均可使用C語(yǔ)言來(lái)開(kāi)發(fā):
- C語(yǔ)言可以寫網(wǎng)站后臺(tái)程序
- C語(yǔ)言可以專門針對(duì)某個(gè)主題寫出功能強(qiáng)大的程序庫(kù)
- C語(yǔ)言可以寫出大型游戲的引擎
- C語(yǔ)言可以寫出另一個(gè)語(yǔ)言來(lái)
- C語(yǔ)言可以寫操作系統(tǒng)和驅(qū)動(dòng)程序,并且只能用C語(yǔ)言編寫
-
任何設(shè)備只要配置了微處理器帽馋,就都支持C語(yǔ)言搅方。從微波爐到手機(jī),都是由C語(yǔ)言技術(shù)來(lái)推動(dòng)的
1.4.4 C語(yǔ)言的簡(jiǎn)潔
C語(yǔ)言僅有32個(gè)關(guān)鍵字绽族,9種控制語(yǔ)句姨涡,34種運(yùn)算符,卻能完成無(wú)數(shù)的功能:
1.4.5 學(xué)習(xí)C語(yǔ)言的常見(jiàn)困惑
1.5 第一個(gè)C語(yǔ)言程序:HelloWorld
1.5.1 編寫C語(yǔ)言代碼:hello.c
#include <stdio.h>
int main()
{
//這是第一個(gè)C語(yǔ)言代碼
printf("hello world\n");
return 0;
}
C語(yǔ)言的源代碼文件是一個(gè)普通的文本文件吧慢,但擴(kuò)展名必須是.c
涛漂。
1.5.2 通過(guò)gcc編譯C代碼
1.gcc編譯器介紹
編輯器(如vi、記事本)是指我用它來(lái)寫程序的(編輯代碼)检诗,而我們寫的代碼語(yǔ)句匈仗,電腦是不懂的,我們需要把它轉(zhuǎn)成電腦能懂的語(yǔ)句逢慌,編譯器就是這樣的轉(zhuǎn)化工具悠轩。就是說(shuō),我們用編輯器編寫程序攻泼,由編譯器編譯后才可以運(yùn)行火架!
編譯器是將易于編寫、閱讀和維護(hù)的高級(jí)計(jì)算機(jī)語(yǔ)言翻譯為計(jì)算機(jī)能解讀忙菠、運(yùn)行的低級(jí)機(jī)器語(yǔ)言的程序何鸡。
gcc(GNU Compiler Collection,GNU 編譯器套件)牛欢,是由 GNU 開(kāi)發(fā)的編程語(yǔ)言編譯器骡男。gcc原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類Unix操作系統(tǒng)(如Linux氢惋、BSD洞翩、Mac OS X等)采納為標(biāo)準(zhǔn)的編譯器稽犁,gcc同樣適用于微軟的Windows。
gcc最初用于編譯C語(yǔ)言骚亿,隨著項(xiàng)目的發(fā)展gcc已經(jīng)成為了能夠編譯C已亥、C++、Java来屠、Ada虑椎、fortran、Object C俱笛、Object C++捆姜、Go語(yǔ)言的編譯器大家族。
編譯命令格式:
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
- 命令迎膜、選項(xiàng)和源文件之間使用空格分隔
- 一行命令中可以有零個(gè)泥技、一個(gè)或多個(gè)選項(xiàng)
- 文件名可以包含文件的絕對(duì)路徑,也可以使用相對(duì)路徑
- 如果命令中不包含輸出可執(zhí)行文件的文件名磕仅,可執(zhí)行文件的文件名會(huì)自動(dòng)生成一個(gè)默認(rèn)名珊豹,Linux平臺(tái)為a.out,Windows平臺(tái)為a.exe
gcc榕订、g++編譯常用選項(xiàng)說(shuō)明:
選項(xiàng) | 含義 |
---|---|
-o file | 指定生成的輸出文件名為file |
-E | 只進(jìn)行預(yù)處理 |
-S(大寫) | 只進(jìn)行預(yù)處理和編譯 |
-c(小寫) | 只進(jìn)行預(yù)處理店茶、編譯和匯編 |
2.Linux平臺(tái)下編譯代碼
-
gcc warning
的意思是警告,是有問(wèn)題劫恒,但不影響編譯 - error是錯(cuò)誤贩幻,如果遇到error,那么就不能編譯了
3.Windows平臺(tái)下gcc環(huán)境配置
windows命令行界面下两嘴,默認(rèn)是沒(méi)有g(shù)cc編譯器丛楚,我們需要配置一下環(huán)境。由于我們安裝了Qt溶诞,Qt是一個(gè)集成開(kāi)發(fā)環(huán)境鸯檬,內(nèi)部集成gcc編譯器,配置一下環(huán)境變量即可使用gcc螺垢。
a)進(jìn)入Qt安裝目錄:
b)拷貝gcc所在的路徑(不同安裝目錄有所差異)
C:\Qt\Qt5.5.0\Tools\mingw492_32\bin
c) 設(shè)置windows環(huán)境變量
計(jì)算機(jī)(右擊)-> 屬性:
如果是win7喧务,雙擊Path后,把拷貝的路徑追加到后面枉圃,路徑之間需要英文”
;
”分隔:如果是win10功茴,界面做得友好一下,新建添加路徑即可:
d)測(cè)試gcc命令:
4.Windows平臺(tái)下編譯代碼
5.注意事項(xiàng)
Linux編譯后的可執(zhí)行程序只能在Linux運(yùn)行孽亲,Windows編譯后的程序只能在Windows下運(yùn)行坎穿。
64位的Linux編譯后的程序只能在64位Linux下運(yùn)行,32位Linux編譯后的程序只能在32位的Linux運(yùn)行。
64位的Windows編譯后的程序只能在64位Windows下運(yùn)行玲昧,32位Windows編譯后的程序可以在64位的Windows運(yùn)行栖茉。
1.5.3 代碼分析
1.include
頭文件包含
-
#include
的意思是頭文件包含,#include <stdio.h>
代表包含stdio.h
這個(gè)頭文件 - 使用C語(yǔ)言庫(kù)函數(shù)需要提前包含庫(kù)函數(shù)對(duì)應(yīng)的頭文件孵延,如這里使用了
printf()
函數(shù)吕漂,需要包含stdio.h
頭文件 - 可以通過(guò)man 3 printf查看printf所需的頭文件
#include< >
與 #include ""
的區(qū)別:
-
< >
表示系統(tǒng)直接按系統(tǒng)指定的目錄檢索 -
""
表示系統(tǒng)先在 "" 指定的路徑(沒(méi)寫路徑代表當(dāng)前路徑)查找頭文件,如果找不到尘应,再按系統(tǒng)指定的目錄檢索
stdio.h
是在操作系統(tǒng)的系統(tǒng)目錄下:
2.main
函數(shù)
- 一個(gè)完整的C語(yǔ)言程序惶凝,是由一個(gè)、且只能有一個(gè)
main()
函數(shù)(又稱主函數(shù)犬钢,必須有)和若干個(gè)其他函數(shù)結(jié)合而成(可選)苍鲜。 -
main
函數(shù)是C語(yǔ)言程序的入口,程序是從main
函數(shù)開(kāi)始執(zhí)行玷犹。
3.{}
括號(hào)混滔,程序體和代碼塊
-
{}
叫代碼塊,一個(gè)代碼塊內(nèi)部可以有一條或者多條語(yǔ)句 - C語(yǔ)言每句可執(zhí)行代碼都是"
;
"分號(hào)結(jié)尾 - 所有的
#
開(kāi)頭的行歹颓,都代表預(yù)編譯指令遍坟,預(yù)編譯指令行結(jié)尾是沒(méi)有分號(hào)的 - 所有的可執(zhí)行語(yǔ)句必須是在代碼塊里面
4.注釋
-
//
叫行注釋,注釋的內(nèi)容編譯器是忽略的晴股,注釋主要的作用是在代碼中加一些說(shuō)明和解釋,這樣有利于代碼的閱讀 -
/**/
叫塊注釋 - 塊注釋是C語(yǔ)言標(biāo)準(zhǔn)的注釋方法
- 行注釋是從C++語(yǔ)言借鑒過(guò)來(lái)的
5.printf
函數(shù)
-
printf
是C語(yǔ)言庫(kù)函數(shù)肺魁,功能是向標(biāo)準(zhǔn)輸出設(shè)備輸出一個(gè)字符串 -
printf(“hello world\n”);
//\n的意思是回車換行
6.return
語(yǔ)句
-
return
代表函數(shù)執(zhí)行完畢电湘,返回return
代表函數(shù)的終止 - 如果
main
定義的時(shí)候前面是int
,那么return
后面就需要寫一個(gè)整數(shù)鹅经;如果main
定義的時(shí)候前面是void
寂呛,那么return
后面什么也不需要寫 - 在
main
函數(shù)中return 0
代表程序執(zhí)行成功,return -1
代表程序執(zhí)行失敗 -
int main()
和void main()
在C語(yǔ)言中是一樣的瘾晃,但C++只接受int main
這種定義方式
1.6 system函數(shù)
1.6.1 system函數(shù)的使用
#include <stdlib.h>
int system(const char *command);
功能:在已經(jīng)運(yùn)行的程序中執(zhí)行另外一個(gè)外部程序
參數(shù):外部可執(zhí)行程序名字
返回值:
成功:不同系統(tǒng)返回值不一樣
失敶尽:通常是 - 1
示例代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//system("calc"); //windows平臺(tái)
system("ls"); //Linux平臺(tái), 需要頭文件#include <stdlib.h>
return 0;
}
1.6.2 system返回值不同系統(tǒng)結(jié)果不一樣
C語(yǔ)言所有的庫(kù)函數(shù)調(diào)用,只能保證語(yǔ)法是一致的蹦误,但不能保證執(zhí)行結(jié)果是一致的劫拢,同樣的庫(kù)函數(shù)在不同的操作系統(tǒng)下執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的强胰。
在學(xué)習(xí)Linux發(fā)展史時(shí)舱沧,我們得知Linux的發(fā)展離不開(kāi)POSIX標(biāo)準(zhǔn)偶洋,只要符合這個(gè)標(biāo)準(zhǔn)的函數(shù)熟吏,在不同的系統(tǒng)下執(zhí)行的結(jié)果就可以一致。
Unix和linux很多庫(kù)函數(shù)都是支持POSIX的,但Windows支持的比較差牵寺。
如果將Unix代碼移植到Linux一般代價(jià)很小悍引,如果把Windows代碼移植到Unix或者Linux就比較麻煩。
1.6.3 Qt圖形界面調(diào)用system
void Widget::on_pushButton_clicked()
{
//system("calc"); //需要頭文件:#include <stdlib.h>
WinExec("calc", SW_NORMAL); //需要頭文件:#include <windows.h>
}
void Widget::on_pushButton_2_clicked()
{
system("notepad");
}
void Widget::on_pushButton_3_clicked()
{
system("mmc");
}
1.6.4 MFC圖形界面調(diào)用system
void CvssystemDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
//WinExec("calc", SW_NORMAL); 需要頭文件:#include <windows.h>
system("calc"); //需要頭文件:#include <stdlib.h>
}
void CvssystemDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知處理程序代碼
//WinExec("notepad", SW_NORMAL);
system("notepad");
}
1.7 C語(yǔ)言編譯過(guò)程
1.7.1 C程序編譯步驟
C代碼編譯成可執(zhí)行程序經(jīng)過(guò)4步:
- 預(yù)處理:宏定義展開(kāi)帽氓、頭文件展開(kāi)趣斤、條件編譯等,同時(shí)將代碼中的注釋刪除杏节,這里并不會(huì)檢查語(yǔ)法
- 編譯:檢查語(yǔ)法唬渗,將預(yù)處理后文件編譯生成匯編文件
- 匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)
- 鏈接:C語(yǔ)言寫的程序是需要依賴各種庫(kù)的,所以編譯之后還需要把庫(kù)鏈接到最終的可執(zhí)行程序中去
1.7.2 gcc編譯過(guò)程
-
分步編譯
預(yù)處理:
gcc -E hello.c -o hello.i
編 譯:gcc -S hello.i -o hello.s
匯 編:gcc -c hello.s -o hello.o
鏈 接:gcc hello.o -o hello_elf
選項(xiàng) | 含義 |
---|---|
-E | 只進(jìn)行預(yù)處理 |
-S(大寫) | 只進(jìn)行預(yù)處理和編譯 |
-c(小寫) | 只進(jìn)行預(yù)處理奋渔、編譯和匯編 |
-o file | 指定生成的輸出文件名為 file
|
文件后綴 | 含義 |
---|---|
.c | C 語(yǔ)言文件 |
.i | 預(yù)處理后的 C 語(yǔ)言文件 |
.s | 編譯后的匯編文件 |
.o | 編譯后的目標(biāo)文件 |
- 一步編譯
gcc hello.c -o demo
(還是經(jīng)過(guò):預(yù)處理镊逝、編譯、匯編嫉鲸、鏈接的過(guò)程):
1.7.3 查找程序所依賴的動(dòng)態(tài)庫(kù)
1)Linux平臺(tái)下撑蒜,ldd
(“l(fā)”為字母) 可執(zhí)行程序:
2)Windows平臺(tái)下,需要相應(yīng)軟件(
Depends.exe
):1.8 CPU內(nèi)部結(jié)構(gòu)與寄存器(了解)
1.8.1 64位和32位系統(tǒng)區(qū)別
- 寄存器是CPU內(nèi)部最基本的存儲(chǔ)單元
- CPU對(duì)外是通過(guò)總線(地址玄渗、控制座菠、數(shù)據(jù))來(lái)和外部設(shè)備交互的,總線的寬度是8位藤树,同時(shí)CPU的寄存器也是8位浴滴,那么這個(gè)CPU就叫8位CPU
- 如果總線是32位,寄存器也是32位的岁钓,那么這個(gè)CPU就是32位CPU
- 有一種CPU內(nèi)部的寄存器是32位的升略,但總線是16位,準(zhǔn)32位CPU
- 所有的64位CPU兼容32位的指令屡限,32位要兼容16位的指令品嚣,所以在64位的CPU上是可以識(shí)別32位的指令
- 在64位的CPU構(gòu)架上運(yùn)行了64位的軟件操作系統(tǒng),那么這個(gè)系統(tǒng)是64位
- 在64位的CPU構(gòu)架上钧大,運(yùn)行了32位的軟件操作系統(tǒng)翰撑,那么這個(gè)系統(tǒng)就是32位
- 64位的軟件不能運(yùn)行在32位的CPU之上
1.8.2 寄存器名字(了解)
8位 | 16位 | 32位 | 64位 |
---|---|---|---|
A | AX | EAX | RAX |
B | BX | EBX | RBX |
C | CX | ECX | RCX |
D | DX | EDX | RDX |
1.8.3 寄存器、緩存啊央、內(nèi)存三者關(guān)系
按與CPU遠(yuǎn)近來(lái)分眶诈,離得最近的是寄存器,然后緩存(CPU緩存)劣挫,最后內(nèi)存册养。
CPU計(jì)算時(shí),先預(yù)先把要用的數(shù)據(jù)從硬盤讀到內(nèi)存压固,然后再把即將要用的數(shù)據(jù)讀到寄存器球拦。于是 CPU<--->寄存器<--->內(nèi)存,這就是它們之間的信息交換。
那為什么有緩存呢坎炼?因?yàn)槿绻鲜遣僮鲀?nèi)存中的同一址地的數(shù)據(jù)愧膀,就會(huì)影響速度。于是就在寄存器與內(nèi)存之間設(shè)置一個(gè)緩存谣光。
因?yàn)閺木彺嫣崛〉乃俣冗h(yuǎn)高于內(nèi)存檩淋。當(dāng)然緩存的價(jià)格肯定遠(yuǎn)遠(yuǎn)高于內(nèi)存,不然的話萄金,機(jī)器里就沒(méi)有內(nèi)存的存在蟀悦。
由此可以看出,從遠(yuǎn)近來(lái)看:CPU〈---〉寄存器〈---> 緩存 <---> 內(nèi)存氧敢。
1.9 匯編語(yǔ)言
1.9.1 VS中C語(yǔ)言嵌套匯編代碼(了解)
#include <stdio.h>
int main()
{
//定義整型變量a, b, c
int a;
int b;
int c;
__asm
{
mov a, 3 //3的值放在a對(duì)應(yīng)內(nèi)存的位置
mov b, 4 //4的值放在a對(duì)應(yīng)內(nèi)存的位置
mov eax, a //把a(bǔ)內(nèi)存的值放在eax寄存器
add eax, b //eax和b相加日戈,結(jié)果放在eax
mov c, eax //eax的值放在c中
}
printf("%d\n", c);//把c的值輸出
return 0;//成功完成
}
1.9.2 VS反匯編
#include <stdio.h>
int main()
{
//定義整型變量a, b, c
int a;
int b;
int c;
a = 3;
b = 4;
c = a + b;
printf("%d\n", c);//把c的值輸出
return 0;//成功完成
}
1.設(shè)置斷點(diǎn)F9
2.選擇反匯編按鈕
3.根據(jù)匯編代碼分析程序
1.10 集成開(kāi)發(fā)環(huán)境IDE
集成開(kāi)發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開(kāi)發(fā)環(huán)境的應(yīng)用程序孙乖,一般包括代碼編輯器浙炼、編譯器、調(diào)試器和圖形用戶界面工具唯袄。集成了代碼編寫功能弯屈、分析功能、編譯功能恋拷、調(diào)試功能等一體化的開(kāi)發(fā)軟件服務(wù)套资厉。所有具備這一特性的軟件或者軟件套(組)都可以叫集成開(kāi)發(fā)環(huán)境。
1.10.1 Qt Creator
Qt Creator是跨平臺(tái)的 Qt IDE蔬顾, Qt Creator 是 Qt 被 Nokia 收購(gòu)后推出的一款新的輕量級(jí)集成開(kāi)發(fā)環(huán)境(IDE)酌住。此 IDE 能夠跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Linux(32 位及 64 位)阎抒、Mac OS X 以及 Windows。根據(jù)官方描述消痛,Qt Creator 的設(shè)計(jì)目標(biāo)是使開(kāi)發(fā)人員能夠利用 Qt 這個(gè)應(yīng)用程序框架更加快速及輕易的完成開(kāi)發(fā)任務(wù)且叁。
快捷鍵 | 含義 |
---|---|
Ctrl + i | 自動(dòng)格式化代碼 |
Ctrl + / | 注釋/取消注釋 |
Alt + Enter | 自動(dòng)完成類函數(shù)定義 |
F4 | .h 文件和對(duì)應(yīng).cpp 文件切換 |
F9 | 設(shè)置斷點(diǎn) |
F5 | 調(diào)試運(yùn)行 |
Ctrl + r | 編譯,但不調(diào)試運(yùn)行 |
Ctrl + b | 編譯秩伞,不運(yùn)行 |
F10 | next調(diào)試 |
F11 | step調(diào)試 |
1.10.2 Microsoft Visual Studio
Microsoft Visual Studio(簡(jiǎn)稱VS)是美國(guó)微軟公司的開(kāi)發(fā)工具包系列產(chǎn)品逞带。VS是一個(gè)基本完整的開(kāi)發(fā)工具集,它包括了整個(gè)軟件生命周期中所需要的大部分工具纱新,如UML工具展氓、代碼管控工具、集成開(kāi)發(fā)環(huán)境(IDE)等等,所寫的目標(biāo)代碼適用于微軟支持的所有平臺(tái)脸爱。Visual Studio是目前最流行的Windows平臺(tái)應(yīng)用程序的集成開(kāi)發(fā)環(huán)境遇汞。
1.VS常用快捷鍵
快捷鍵 | 含義 |
---|---|
Ctrl + k,Ctrl + f | 自動(dòng)格式化代碼 |
Ctrl + k,Ctrl + c | 注釋代碼 |
Ctrl + k,Ctrl + u | 取消注釋代碼 |
F9 | 設(shè)置斷點(diǎn) |
F5 | 調(diào)試運(yùn)行 |
Ctrl + F5 | 不調(diào)試運(yùn)行 |
Ctrl + Shift + b | 編譯,不運(yùn)行 |
F10 | next調(diào)試 |
F11 | step調(diào)試 |
2.VS2013的C4996錯(cuò)誤
由于微軟在VS2013中不建議再使用C的傳統(tǒng)庫(kù)函數(shù)scanf
,strcpy
,sprintf
等,所以直接使用這些庫(kù)函數(shù)會(huì)提示C4996錯(cuò)誤:
VS建議采用帶
_s
的函數(shù)空入,如scanf_s
络它、strcpy_s
,但這些并不是標(biāo)準(zhǔn)C函數(shù)歪赢。
要想繼續(xù)使用此函數(shù)化戳,需要在源文件中添加以下指令就可以避免這個(gè)錯(cuò)誤提示:
#define _CRT_SECURE_NO_WARNINGS //這個(gè)宏定義最好要放到.c文件的第一行
#pragma warning(disable:4996) //或者使用這個(gè)