Fluent UDF【6】:預(yù)處理命令【轉(zhuǎn)發(fā)】
2017-07-05 by:CAE仿真在線 來(lái)源:互聯(lián)網(wǎng)
今天要講的內(nèi)容是關(guān)于C語(yǔ)言的預(yù)處理。搞清楚了這個(gè),就可以分析UDF中的各種頭文件源代碼,從此寫UDF不求人。
本文部分內(nèi)容參考自《程序設(shè)計(jì)與C語(yǔ)言引論》第2版。
在UDF的各種頭文件中(文件路徑D:\Program Files\ANSYS Inc\v180\fluent\fluent18.0.0\src),存在各種以#開(kāi)頭的語(yǔ)句,如下圖中所示。
這些以#開(kāi)頭的語(yǔ)句就是C語(yǔ)言的預(yù)處理命令。
C語(yǔ)言的預(yù)處理工作由一個(gè)預(yù)處理程序來(lái)完成,任何C系統(tǒng)都有一個(gè)預(yù)處理程序,其負(fù)責(zé)處理源程序中的所有預(yù)處理命令,從而生成不含預(yù)處理命令的源程序。C語(yǔ)言的預(yù)處理目的是為了方便編程。
預(yù)處理命令以獨(dú)立的預(yù)處理命令行的形式出現(xiàn)在源程序中,# 是其特殊的引導(dǎo)符號(hào)。如果源程序中某一行的第一個(gè)非空格符號(hào)是 # ,這就是一個(gè)預(yù)處理命令行。預(yù)處理命令的作用是要求預(yù)處理程序完成一些操作。
文件包含命令是以#include開(kāi)始的行,其作用是把特定文件的內(nèi)容復(fù)制到當(dāng)前源文件中。其存在兩種形式:
# include <文件名> # include "文件名"
兩者的差異在于文件搜索方式的不同。
第一種形式,預(yù)處理程序直接到系統(tǒng)指定的某些目錄中去查找所需文件,目錄指定方式由具體系統(tǒng)確定,通常指定幾個(gè)系統(tǒng)目錄。
第二種形式,預(yù)處理程序現(xiàn)在源文件所在目錄中查找,若沒(méi)找到文件則再到系統(tǒng)指定的目錄中去查找。
文件包含命令的處理過(guò)程:首先查找所需文件,找到后就用該文件的內(nèi)容取代這個(gè)包含命令行。替換進(jìn)來(lái)的文件中若有預(yù)處理命令,也將被處理。
以#define開(kāi)始的行稱為宏定義命令行。宏定義包含兩種形式:
-
簡(jiǎn)單宏定義
-
帶參數(shù)宏定義
簡(jiǎn)單宏定義的形式為:
#define 宏名字 替代文本
其中宏名字是任意標(biāo)識(shí)符,替代文本可以是任意一段正文,其中可以包括程序中能出現(xiàn)的任何字符(包括空格等),一直延續(xù)到本行結(jié)束。如果需要寫多行的替代文本,可以在行末寫一個(gè)反斜杠\,這將使下一行內(nèi)容繼續(xù)被當(dāng)做替代文本。
宏定義的作用就是為宏名字定義替代。
如果一個(gè)宏名字的替代文本是數(shù)值或可以靜態(tài)求值的表達(dá)式,當(dāng)這個(gè)宏名字在程序某處出現(xiàn),就相當(dāng)于在那里寫了這個(gè)數(shù)值或表達(dá)式。
例如,如果進(jìn)行了如下定義:
伺候,宏名字SLD就代表static long double。若程序中出現(xiàn):
SLD x=2.4, y=9.16;經(jīng)過(guò)預(yù)處理后,源代碼被翻譯為:
static long double x=2.4,y=9.16;預(yù)處理并不檢查宏定義中的替代文本是否為合法的C語(yǔ)言結(jié)構(gòu),也不檢查替換之后的結(jié)果是否為正確的C語(yǔ)言程序段,其只是簡(jiǎn)單地完成文本替換工作。
帶參數(shù)的宏定義形式為:
#define 宏名字(參數(shù)列表) 替代正文
使用帶參宏時(shí),不但要給出宏的名字,還要用類似函數(shù)實(shí)參的形式給出各宏參數(shù)的替代段,多個(gè)替代段之間用逗號(hào)分隔。這種形式也成為一個(gè)宏調(diào)用。
對(duì)宏調(diào)用的替換分兩部分進(jìn)行:首先用實(shí)際替代段去替換宏定義的替代正文里出現(xiàn)的各個(gè)宏參數(shù),然后把替換的結(jié)果(展開(kāi)后的替代正文)代入程序里出現(xiàn)宏調(diào)用的為準(zhǔn)。例如,定義求兩個(gè)數(shù)據(jù)中較小數(shù),可定義宏:
若程序中出現(xiàn)如下語(yǔ)句:
z = min(x+y,x*y)則宏展開(kāi)后則為:
z = ((x+y)<(x*y)?(x+y):(x*y));帶參數(shù)的宏定義與函數(shù)看起來(lái)很類似,但實(shí)際上有很大的不同。切記宏定義只是簡(jiǎn)單的文本替換。
條件編譯的作用是在源程序中劃出一些片段,使預(yù)處理程序可根據(jù)條件保留或丟掉一段,或從幾段中選擇一段保留。實(shí)現(xiàn)條件編譯的預(yù)處理命令有四個(gè),分別是:
#if #else #elif #endif其中,#if和#elif命令以一個(gè)能靜態(tài)求出整型值的表達(dá)式為參數(shù)。另外兩個(gè)沒(méi)有參數(shù)。條件編譯命令的常見(jiàn)使用形式有三種:
形式一
#if 整形表達(dá)式 …… /*代碼片段,條件成立時(shí)保留*/ #endif形式二
#if 整形表達(dá)式 …… /*條件成立時(shí)保留*/ #else …… /*條件不成立時(shí)保留*/ #endif形式三
#if 整形表達(dá)式 …… /*條件成立時(shí)保留*/ #elif 整形表達(dá)式 …… /*elif部分,可以有多個(gè)*/ #elif 整形表達(dá)式 …… #else …… /*條件都不成立時(shí)保留*/ #endif
其中整形表達(dá)式是預(yù)處理?xiàng)l件,值為0表示條件不成立,否則條件成立。這里常用==,!=等做判斷,例如判斷宏定義的符號(hào)是不是等于某個(gè)值等。
為了方便,C語(yǔ)言提供了一個(gè)特殊謂詞defined,其使用形式有兩種:
當(dāng)標(biāo)識(shí)符是有定義的宏名字時(shí),define(標(biāo)識(shí)符)將得到1,否則得到0。這種表達(dá)式常被作為條件編譯的條件。此外還有兩個(gè)預(yù)處理命令#ifdef和ifndef,他們相當(dāng)于#if和#define混合的簡(jiǎn)寫形式。
#ifdef 標(biāo)識(shí)符 /*相當(dāng)于#if define(標(biāo)識(shí)符)*/ #ifndef 標(biāo)識(shí)符 /*相當(dāng)于#if !define(標(biāo)識(shí)符)*/
周末有活動(dòng),提前更新~
轉(zhuǎn)自公眾號(hào):胡坤 CFD仿真之道
相關(guān)標(biāo)簽搜索:Fluent UDF【6】:預(yù)處理命令【轉(zhuǎn)發(fā)】 Fluent培訓(xùn) Fluent流體培訓(xùn) Fluent軟件培訓(xùn) fluent技術(shù)教程 fluent在線視頻教程 fluent資料下載 fluent分析理論 fluent化學(xué)反應(yīng) fluent軟件下載 UDF編程代做 Fluent、CFX流體分析 HFSS電磁分析