使用標頭檔範例 使用標頭檔範例
使用標頭檔範例- Header1.h
定義PI、巨集以及函式的原型如下:
#include "stdio.h"
#include "stdlib.h"
#define PI 3.14159
//----定義巨集
#define AreaOfCircle(r) PI*(r)*(r)
#define Perimeter(r) (2*PI*(r))
//---定義函式原型
float testfun1(float r);
void testfun2();
使用標頭檔範例 使用標頭檔範例 使用標頭檔範例 使用標頭檔範例
可以一樣透過#include來引用,例如:
#include "stdafx.h"
#include "MyHeader.h"
int main()
{ float r;
printf("請輸入圓的半徑:");
scanf("%f",&r);
printf("圓周長為:%f\n",Perimeter(r));
printf("圓面積為:%f\n",AreaOfCircle(r));
system("pause");
}
使用標頭檔範例 使用標頭檔範例 使用標頭檔範例 使用標頭檔範例
可以一樣透過#include來引用,例如:
//---以下設計函式--- float testfun1(float r)
{
//--在函式中使用巨集
return (Perimeter(r));
}
9-4 條件式編譯 條件式編譯 條件式編譯( 條件式編譯 ( (Conditional ( Compilation) ) ) )
所謂的條件是編譯就是可以透過前置指令 來引導編譯器作某一個部分程式碼的編 譯。例如:您想要開發一個Linux/
Windows 平台上都可以執行的C程式(就是 有跨平台的問題),雖然理論上C的可攜性 很高,只要將原始碼拿到不同平台上重新 編譯就可以了。
但實際上由於作業系統或C編譯器上的些 許差異存在,因此可在同一個原始檔案中 標示編譯的條件讓編譯器可以選擇正確的 程式碼做編譯。
9-4 條件式編譯 條件式編譯 條件式編譯( 條件式編譯 ( (Conditional ( Compilation) ) ) )
條件式編譯的成員:#if、#endif、#else、
#elif、#ifdef 以及#ifndef。
各種指示詞的用法說明如下:
每一個#if都必須搭配一個#endif。
#elif可以出現任意個在#if與#endif中,但是
#else最多就只能有一個。
#if、#elif、#else以及 #endif 指示詞可以行成 巢狀結構。
#ifdef用來檢查某一名詞是否有經過#define定 義;而#ifndef則用來檢查一名詞是否沒有被
#define定義
9-4 條件式編譯 條件式編譯 條件式編譯( 條件式編譯 ( (Conditional ( Compilation) ) ) )
#ifdef的用法為:
#ifdef identifier 用來檢查是否有#define
identifier這樣的敘述存在,事實上也可以用#if 來完成,如下列所示:
#if defined identifier同理,#ifndef identifier也 就與#if !defined identifier是相同的意思。
條件式編譯 條件式編譯 條件式編譯
條件式編譯( ( (Conditional ( Compilation) ) ) ) 範例 範例 範例 範例
問題描述問題描述問題描述問題描述::::使用條件式編譯的指令來展示如何 運用。
條件式編譯 條件式編譯 條件式編譯
條件式編譯( ( (Conditional ( Compilation) ) ) ) 範例 範例 範例 範例
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#define OS //---定義OS
int main()
{
#if defined OS //--檢查是否有定義OS
#define STACK 200 //---如果有定義OS,則STACK定為
printf("OS有定義\n"); //--可以撰寫C程式碼
#else
#define STACK 100 //---否則STACK定為
printf("OS未定義\n");
#endif
printf("STACK=%d\n",STACK);
system("pause");
條件式編譯 條件式編譯 條件式編譯
條件式編譯( ( (Conditional ( Compilation) ) ) ) 範例 範例 範例 範例
#undef OS //--使用#undef取消#define對OS的定義
#undef STACK //--使用#undef取消#define對STACK的定義
#if defined OS //---OS已被#undef取消定義了
#define STACK 200
printf("OS有定義\n");
#else
#define STACK 100
printf("OS未定義\n");
#endif
printf("STACK=%d\n",STACK);
system("pause");
}
有傳回值的函式設計與使用
宣告時必須指定傳回的資料型態,例如:
int getsum()
使用return敘述傳回資料時可以使用小括號,也 可以不使用,例如: return(ret_data) 或是return
ret_data來回傳資料。其中的ret_data必須是函式
規劃的傳回資料型別,或是允許隱含資料轉換 的相容資料型別,否則將會發生錯誤。極建議程式設計時能統一函式宣告與回傳的資 料型別,因為如果回傳的值過大而造成溢位
(Overflow)的錯誤發生時並不會引發編譯時期或
執行時期的錯誤。但是執行的結果就會不符合 預期。有傳回值的函式設計與使用
在主程式中呼叫有傳回值的函式一樣是直接使 用函式的名稱即可,但是因為所呼叫的函式有 傳回值,因此可以使用一個同型別的資料變數 來接收(如果型別不同也可以透過隱含或是強制 型別轉換的方式),例如上述程式中:
int sum=getsum();
這一行程式就是在宣告整數變數sum時順便給予 初始值,而初始值的來源就是getsum()函式的回 傳值。事實上,如果傳回的值無其他作用而只 是要簡單的顯示,那麼本範例的程式也可以簡 化成一行: