1.關于可移植性
#ifdef __STRICT_ANSI__
/* use ANSI/ISO C only here
*/
#else
/* use GNU extensions here
*/
#endif
如果用戶或是ANSI兼容的編譯器定義了__STRICT_ANSI__宏,則表明需施加ANSI兼容的環境,并編譯#ifdef語句塊的第一部分代碼.否則,編譯#else后面的代碼.
2.GNU擴展
gcc使用long
long 類型來提供64位儲存單元:
long long
long_int_var;
內聯函數
要使用內聯函數,需在函數的返回類型前面插入關鍵字inline,如下面的代碼片段所示,還要在編譯時使用-O優化選項.
inline
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b
=
tmp;
}
函數和變量屬性
關鍵字attribute通過向gcc指明有關代碼的更多信息來幫助代碼優化工作進行得更好.例如,標準庫函數exit和
abort都不返回調用它們的函數.編譯器如果知道它們不返回就能生成效率稍高的代碼.當然用戶程序也能定義不返回的函數.gcc允許為這些函數指定
noreturn屬性,作為編譯器在優化該函數時的提示.
例如,假設有個沒有返回的函數die_on_error.為了使用函數屬性,可以在函數聲明后面加上__attribute__((attribute_name)).于是函數die_on_error的聲明如下:
void
die_on_error(void) __attribute__ ((noreturn));
函數還和平常一樣來定義:
#include
<stdlib.h>
void die_on_error(void)
{
/* your code here
*/
exit(EXIT_FAILURE);
}
也可以對變量指定屬性.例如,aligned屬性指示編譯器在為變量分配內存空間時按指定字節數對齊邊界.下列語句:
int
int_var __attribute__ ((aligned 16)) =
0;
使gcc讓變量int_var的邊界按16字節對齊.packed屬性告訴gcc為變量或結構分配最小的內存空間.
如果想要關閉對未用變量發出的所有警告,那么可以對變量使用unused屬性,它告訴編譯器該變量不準備使用.下面的變量聲明會消除警告:
float
big_salary __attribute__
((unused));
使用case區間
case區間是一個非常有用的擴展.其語法如下:
case LOWVAL ...
LOWVAL:
注意,在省略號前后必須有空格.在switch語句中,case區間指定了落在LOWVAL和HIVAL區間內的那些整數值.例如:
switch(int_var)
{
case 0 ... 2:
/* your code here */
break;
case 3 ...
5:
/* more code here */
break;
default:
/* default
code here
*/
}
構造函數名稱
把函數名用作字符串是GNU的擴展,它能極大地簡化調試工作.gcc預先定義了變量__FUNCTION__為當前函數(控制流程當前所在的位置)的名字,就好像它被寫在源代碼里去了一樣.
使用__FUNCTION__變量
/*
* showit.c
- Illustrate using the __FUNCTION__ variable
*/
#include
<stdio.h>
void foo(void);
int
main(void)
{
printf("The current function is %s\n",
__FUNCTION__);
foo();
return 0;
}
void
foo(void)
{
printf("The current function is %s\n", __FUNCTION__);
}