不符合ANSI/ISO的源代碼
/*
* pedant.c - use -ansi, -pedantic or -pedantic-errors
*/
#include <stdio.h>
void main(void)
{
long long int i = 0l;
printf("This is a non-conforming c program\n");
}
使用gcc pedant.c -o pedant這個(gè)命令時(shí),編譯器會(huì)警告main函數(shù)的返回類(lèi)型無(wú)效:
$gcc pedant.c -o pedant
pedant.c:In function 'main':
pedant.c:7 warning:return type of 'main' is not 'int'
現(xiàn)在給gcc加上-ansi選項(xiàng):
$gcc -ansi pedant.c -o pedant
$gcc pedant.c -o pedant
pedant.c: In function 'main'
pedant.c:7 warning: return type of 'main' is not 'int'
gcc再次給出了同樣的警告信息,并忽略了無(wú)效的數(shù)據(jù)類(lèi)型.
-ansi,-pedantic以及-pedantic-errors編譯選項(xiàng)并不能保證被編譯的程序的ANSI/ISO兼容性,它們僅被用來(lái)幫助程序員離這個(gè)目標(biāo)更近.
$gcc -Wall pedant.c -o pedant
pedant.c:7: warning: return type of 'main' is not 'int'
pedant.c: In function 'main':
pedant.c:8 warning: unused variable 'i'
-Wall系列選項(xiàng)的另一個(gè)極端是-w選項(xiàng),它能關(guān)閉所有的警告信息。-W{warning}選項(xiàng)的作用是打開(kāi)warning所指出的用戶感興趣的特殊警 告信息,比如隱身函數(shù)說(shuō)明(-Wimplicit-function-declaration)或者隱身聲明返回類(lèi)型的函數(shù)(-Wreturn- type).前者的作用在于它提示出定義了一個(gè)函數(shù)卻沒(méi)有事先聲明或者忘記了包含適當(dāng)?shù)念^文件.后者的作用在于指出聲明的函數(shù)可能沒(méi)有指定它的返回類(lèi)型, 此時(shí)默認(rèn)的返回類(lèi)型為int.
提示:如果只想檢查語(yǔ)法而實(shí)際上不做如何編譯工作,那么可以調(diào)用帶有-fsyntax-only參數(shù)的GCC.
選項(xiàng) 說(shuō)明
-Wcomment 如果出現(xiàn)了注解嵌套(在第一個(gè)/*之后又出現(xiàn)了第二個(gè)/*)則發(fā)出警告
-Wformat 如果傳遞給printf及及其相關(guān)函數(shù) 的參數(shù)和對(duì)應(yīng)的格式字符串中指定的類(lèi)型不平配則發(fā)出警告
-Wmain 如果main的返回類(lèi)型不 是int或者調(diào)用main時(shí)使用的參數(shù)數(shù)目不正確則不出警告
-Wparentheses 如果在出現(xiàn)了賦值(例如,(n=10))的地方使用了括號(hào),而那里根據(jù)前后關(guān)系推斷應(yīng)該是比較(例如,(n==100))而非賦值的時(shí)候,或者如果括號(hào)能夠解決運(yùn)算優(yōu)先級(jí)問(wèn)題的時(shí)候,發(fā)出警告
-Wswitch 如果swtich語(yǔ)句少了它的一個(gè)或多 個(gè)枚舉值的case分支(只有索引值是enum類(lèi)型時(shí)才適用)則發(fā)出警告
-Wunused 如果聲明的變量沒(méi)有使用,或者函數(shù)聲明 為static類(lèi)型但卻從未使用,則發(fā)出警告
-Wuninitialized 如果使用的自動(dòng)變量沒(méi)有初始化則發(fā)出警告
-Wundef 如果在#if宏中使用了未定義的變量作判斷則發(fā)出警告
-Winline 如果函數(shù)不能被內(nèi)聯(lián)則發(fā)出警告
-Wmissing-declarations 如果定義了全局函數(shù)但卻沒(méi)有在任何頭文件中聲明它,則發(fā)出警告
-Wlong-long 如果使用了long long類(lèi)型則發(fā)出警告
-Werror 將所有的警告轉(zhuǎn)變?yōu)殄e(cuò)誤
常見(jiàn)的編程錯(cuò)誤:
/*
* blunder.c - Mistakes caught by -W(warning)
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, j;
printf("%c\n", "not a character"); /* -Wformat */
if(i = 10) /* -Wparenthesses */
printf("oops\n");
if(j != 10) /* -Wuninitialized */
printf("another oops\n");
/* /* */ /* -Wcomment */
no_decl(); /* -Wmissing-declaration */
return (EXIT_SUCCESS);
}
void no_decl(void)
{
printf("no_decl\n");
}
$gcc blunder.c -o blunder
blunder.c:27: warning: type mismatch with previous implicit declaration
blunder.c:21: warning: previous implicit declaration of 'no_decl'
blunder.c:27: warning: 'no_decl' was previously implicitly declared to return 'int'
gcc只發(fā)出了和隱式聲明no_decl函數(shù)有關(guān)的警告.它忽略了其他潛在的錯(cuò)誤,這些錯(cuò)誤包括:
.傳遞給printf的參數(shù)類(lèi)型(一個(gè)字符串)和格式化字符串定義的類(lèi)型(一個(gè)字符)不匹配.這會(huì)產(chǎn)生一個(gè)-Wformat警告.
.變量i和j使用前都沒(méi)有初始化.它們中的任何一個(gè)都產(chǎn)生-Wuninitialized警告.
.在根據(jù)前后關(guān)系推斷應(yīng)該對(duì)變量i的值做比較的地方,卻對(duì)變量i進(jìn)行賦值.這應(yīng)該會(huì)產(chǎn)生一個(gè)-Wparentheses警告.
.在注釋嵌套開(kāi)始的地方應(yīng)該會(huì)產(chǎn)生一個(gè)-Wcomment警告.
/*
* pedant.c - use -ansi, -pedantic or -pedantic-errors
*/
#include <stdio.h>
void main(void)
{
long long int i = 0l;
printf("This is a non-conforming c program\n");
}
使用gcc pedant.c -o pedant這個(gè)命令時(shí),編譯器會(huì)警告main函數(shù)的返回類(lèi)型無(wú)效:
$gcc pedant.c -o pedant
pedant.c:In function 'main':
pedant.c:7 warning:return type of 'main' is not 'int'
現(xiàn)在給gcc加上-ansi選項(xiàng):
$gcc -ansi pedant.c -o pedant
$gcc pedant.c -o pedant
pedant.c: In function 'main'
pedant.c:7 warning: return type of 'main' is not 'int'
gcc再次給出了同樣的警告信息,并忽略了無(wú)效的數(shù)據(jù)類(lèi)型.
-ansi,-pedantic以及-pedantic-errors編譯選項(xiàng)并不能保證被編譯的程序的ANSI/ISO兼容性,它們僅被用來(lái)幫助程序員離這個(gè)目標(biāo)更近.
$gcc -Wall pedant.c -o pedant
pedant.c:7: warning: return type of 'main' is not 'int'
pedant.c: In function 'main':
pedant.c:8 warning: unused variable 'i'
-Wall系列選項(xiàng)的另一個(gè)極端是-w選項(xiàng),它能關(guān)閉所有的警告信息。-W{warning}選項(xiàng)的作用是打開(kāi)warning所指出的用戶感興趣的特殊警 告信息,比如隱身函數(shù)說(shuō)明(-Wimplicit-function-declaration)或者隱身聲明返回類(lèi)型的函數(shù)(-Wreturn- type).前者的作用在于它提示出定義了一個(gè)函數(shù)卻沒(méi)有事先聲明或者忘記了包含適當(dāng)?shù)念^文件.后者的作用在于指出聲明的函數(shù)可能沒(méi)有指定它的返回類(lèi)型, 此時(shí)默認(rèn)的返回類(lèi)型為int.
提示:如果只想檢查語(yǔ)法而實(shí)際上不做如何編譯工作,那么可以調(diào)用帶有-fsyntax-only參數(shù)的GCC.
選項(xiàng) 說(shuō)明
-Wcomment 如果出現(xiàn)了注解嵌套(在第一個(gè)/*之后又出現(xiàn)了第二個(gè)/*)則發(fā)出警告
-Wformat 如果傳遞給printf及及其相關(guān)函數(shù) 的參數(shù)和對(duì)應(yīng)的格式字符串中指定的類(lèi)型不平配則發(fā)出警告
-Wmain 如果main的返回類(lèi)型不 是int或者調(diào)用main時(shí)使用的參數(shù)數(shù)目不正確則不出警告
-Wparentheses 如果在出現(xiàn)了賦值(例如,(n=10))的地方使用了括號(hào),而那里根據(jù)前后關(guān)系推斷應(yīng)該是比較(例如,(n==100))而非賦值的時(shí)候,或者如果括號(hào)能夠解決運(yùn)算優(yōu)先級(jí)問(wèn)題的時(shí)候,發(fā)出警告
-Wswitch 如果swtich語(yǔ)句少了它的一個(gè)或多 個(gè)枚舉值的case分支(只有索引值是enum類(lèi)型時(shí)才適用)則發(fā)出警告
-Wunused 如果聲明的變量沒(méi)有使用,或者函數(shù)聲明 為static類(lèi)型但卻從未使用,則發(fā)出警告
-Wuninitialized 如果使用的自動(dòng)變量沒(méi)有初始化則發(fā)出警告
-Wundef 如果在#if宏中使用了未定義的變量作判斷則發(fā)出警告
-Winline 如果函數(shù)不能被內(nèi)聯(lián)則發(fā)出警告
-Wmissing-declarations 如果定義了全局函數(shù)但卻沒(méi)有在任何頭文件中聲明它,則發(fā)出警告
-Wlong-long 如果使用了long long類(lèi)型則發(fā)出警告
-Werror 將所有的警告轉(zhuǎn)變?yōu)殄e(cuò)誤
常見(jiàn)的編程錯(cuò)誤:
/*
* blunder.c - Mistakes caught by -W(warning)
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, j;
printf("%c\n", "not a character"); /* -Wformat */
if(i = 10) /* -Wparenthesses */
printf("oops\n");
if(j != 10) /* -Wuninitialized */
printf("another oops\n");
/* /* */ /* -Wcomment */
no_decl(); /* -Wmissing-declaration */
return (EXIT_SUCCESS);
}
void no_decl(void)
{
printf("no_decl\n");
}
$gcc blunder.c -o blunder
blunder.c:27: warning: type mismatch with previous implicit declaration
blunder.c:21: warning: previous implicit declaration of 'no_decl'
blunder.c:27: warning: 'no_decl' was previously implicitly declared to return 'int'
gcc只發(fā)出了和隱式聲明no_decl函數(shù)有關(guān)的警告.它忽略了其他潛在的錯(cuò)誤,這些錯(cuò)誤包括:
.傳遞給printf的參數(shù)類(lèi)型(一個(gè)字符串)和格式化字符串定義的類(lèi)型(一個(gè)字符)不匹配.這會(huì)產(chǎn)生一個(gè)-Wformat警告.
.變量i和j使用前都沒(méi)有初始化.它們中的任何一個(gè)都產(chǎn)生-Wuninitialized警告.
.在根據(jù)前后關(guān)系推斷應(yīng)該對(duì)變量i的值做比較的地方,卻對(duì)變量i進(jìn)行賦值.這應(yīng)該會(huì)產(chǎn)生一個(gè)-Wparentheses警告.
.在注釋嵌套開(kāi)始的地方應(yīng)該會(huì)產(chǎn)生一個(gè)-Wcomment警告.