首頁 系統教程 Linux GCC指令:解鎖Linux程式設計的無限可能

GCC指令:解鎖Linux程式設計的無限可能

Feb 10, 2024 pm 06:54 PM
linux linux教程 linux系統 linux指令 shell腳本 overflow 嵌入式linux linux入門 linux學習

作為廣受歡迎的開源編譯器,GCC(GNU Compiler Collection)已經成為了Linux軟體開發的標配之一。如果你想要進入Linux程式設計的世界,那麼掌握GCC指令是不可或缺的。無論你是初學者還是專業開發人員,GCC都能為你帶來無限的可能性。

gcc 編譯器提供了幾乎數不清的命令列選項清單。當然,沒有人會使用過或精通它所有的命令列選項,但是有一些命令列選項是每一個 gcc 用戶都應該知道的 – 即使不是必須知道。它們中有一些很常用,其他一些不太常用,但不常用並不意味著它們的用處沒前者大。

在這個系列的文章中,我們集中在一些不常用但是很有用的 gcc 命令列選項,在第一節已經講到幾個這樣的命令列選項。

不知道你是否能夠回想起,在這個系列教程的第一部分的開始,我簡要的提到了開發者通常用來產生警告的-Wall 選項,並不包括一些特殊的警告。如果你不了解這些特殊警告,並且不知道如何產生它們,不用擔心,我將在這篇文章中詳細講解關於它們所有的細節。

除此之外,這篇文章也將涉及與浮點值相關的 gcc 警告選項,以及在 gcc 命令列選項列表變得很大的時候如何更好的管理它們。

在繼續之前,請記住,這個教程中的所有範例、命令和指令都已在 Ubuntu 16.04 LTS 作業系統和 gcc 5.4.0 上測試過。

GCC指令:解鎖Linux程式設計的無限可能

產生 -Wall 選項不包含的警告

#儘管 gcc 編譯器的 -Wall選項涵蓋了絕大多數警告標記,但仍然有一些警告不能產生。為了生成它們,請使用 -Wextra選項。

例如,下面的程式碼:

#include 
#include 
int main()
{
    int i=0;
    /* ...
       some code here 
       ...
    */

    if(i);
        return 1;
     return 0; 
}
登入後複製

我不小心在 if 條件後面多打了一個分號。現在,如果使用下面的 gcc 指令來進行編譯,不會產生任何警告。
gcc -Wall test.c -o test

#但是如果同時使用-Wextra 選項來進行編譯:gcc -Wall -Wextra test.c -o test
會產生下面這樣一個警告:

test.c: In function ‘main’:
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement
[-Wempty-body] if(i);
登入後複製

從上面的警告清楚的看到,-Wextra 選項從內部啟用了-Wempty-body 選項,從而可以偵測可疑程式碼並產生警告。下面是這個選項啟用的全部警告標記。

-Wclobbered
-Wempty-body
-Wignored-qualifiers
-Wmissing-field-initializers
-Wmissing-parameter-type(仅针对 C 语言)
-Wold-style-declaration(仅针对 C 语言)
-Woverride-init
-Wsign-compare
-Wtype-limits
-Wuninitialized
-Wunused-parameter(只有和-Wunused 或 -Wall 选项使用时才会启用)
-Wunused-but-set-parameter (只有和-Wunused或-Wall 选项使用时才会生成)
登入後複製

如果想對上面所提到的標記有更進一步的了解,請查看 gcc 手冊。

此外,遇到下面這些情況,-Wextra 選項也會產生警告:

一个指针和整数 0 进行 , 或 >= 比较
(仅 C++)一个枚举类型和一个非枚举类型同时出现在一个条件表达式中
(仅 C++)有歧义的虚拟基底
(仅 C++)寄存器类型的数组加下标
(仅 C++)对寄存器类型的变量进行取址
(仅 C++)基类没有在派生类的复制构建函数中进行初始化
登入後複製

浮點值的等值比較時產生警告

你可能已經知道,浮點數值不能進行確切的相等比較(如果不知道,請閱讀與浮點數值比較相關的 FAQ)。但如果你不小心這樣做了, gcc 編譯器是否會報出錯誤或警告?讓我們來測試一下:

下面是一段使用 == 運算子進行浮點數值比較的程式碼:

#include

void compare(float x, float y)
{
    if(x == y)
    {
        printf("/n EQUAL /n");
    }
}

int main(void)
{
    compare(1.234, 1.56789);

    return 0; 
}
登入後複製

使用下面的 gcc 指令(包含 -Wall 和 -Wextra 選項)來編譯這段程式碼:

gcc -Wall -Wextra test.c -o test
登入後複製

遺憾的是,上面的指令沒有產生任何與浮點數值比較相關的警告。快速看一下 gcc 手冊,在這種情況下可以使用一個專用的 -Wfloat-equal 選項。
下面是包含這個選項的指令:

gcc -Wall -Wextra -Wfloat-equal test.c -o test
登入後複製

下面是這條指令產生的輸出:

test.c: In function ‘compare’:
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
 if(x == y)
登入後複製

如同上面你所看到的輸出一樣,-Wfloat-equal 選項會強制 gcc 編譯器產生一個與浮點數值比較相關的警告。

這兒是gcc 手冊關於這個選項的說明:

#這背後的想法是,有時,對程式設計師來說,把浮點數值考慮成近似無限精確的實數是方便的。如果你這樣做,那麼你需要透過分析程式碼,或其他方式,算出這種計算方式引入的最大或可能的最大誤差,然後進行比較時(以及產生輸出時,不過這是一個不同的問題)允許這個誤差。特別要指出,不應該檢查是否相等,而應該檢查兩個值是否可能出現範圍重疊;這是用關係運算子來做的,所以等值比較可能是搞錯了。

#如何更好的管理 gcc 命令列選項

如果在你使用的 gcc 命令中,命令行选项列表变得很大而且很难管理,那么你可以把它放在一个文本文件中,然后把文件名作为 gcc 命令的一个参数。之后,你必须使用@file 命令行选项。

比如,下面这行是你的 gcc 命令:
gcc -Wall -Wextra -Wfloat-equal test.c -o test

然后你可以把这三个和警告相关的选项放到一个文件里,文件名叫做 gcc-options:
$ cat gcc-options
-Wall -Wextra -Wfloat-equal
这样,你的 gcc 命令会变得更加简洁并且易于管理:
gcc @gcc-options test.c -o test

下面是 gcc 手册关于 @file 的说明:

从文件中读取命令行选项。读取到的选项随之被插入到原始 @file 选项所在的位置。如果文件不存在或者无法读取,那么这个选项就会被当成文字处理,而不会被删除。

文件中的选项以空格分隔。选项中包含空白字符的话,可以用一个由单引号或双引号包围完整选项。任何字符(包括反斜杠: ‘/’)均可能通过一个 ‘/’ 前缀而包含在一个选项中。如果该文件本身包含额外的 @file选项,那么它将会被递归处理。

结论

在这个系列的教程中,我们一共讲解了 5 个不常见但是很有用的 gcc 命令行选项:

-Save-temps
-g
-Wextra
-Wfloat-equal

@file
登入後複製

记得花时间练习使用每一个选项,同时不要忘了浏览 gcc 手册上面所提供的关于它们的全部细节。

因此,无论你是正在学习Linux编程,还是已经成为一名经验丰富的开发者,掌握GCC命令将会让你事半功倍。尝试使用GCC命令去编译各种不同的程序,挑战自己的极限,让你的Linux编程之路越来越精彩

以上是GCC指令:解鎖Linux程式設計的無限可能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

vscode終端命令不能用 vscode終端命令不能用 Apr 15, 2025 pm 10:03 PM

VS Code 終端命令無法使用的原因及解決辦法:未安裝必要的工具(Windows:WSL;macOS:Xcode 命令行工具)路徑配置錯誤(添加可執行文件到 PATH 環境變量中)權限問題(以管理員身份運行 VS Code)防火牆或代理限制(檢查設置,解除限制)終端設置不正確(啟用使用外部終端)VS Code 安裝損壞(重新安裝或更新)終端配置不兼容(嘗試不同的終端類型或命令)特定環境變量缺失(設置必要的環境變量)

See all articles