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版。

1

關(guān)于預(yù)處理

在UDF的各種頭文件中(文件路徑D:\Program Files\ANSYS Inc\v180\fluent\fluent18.0.0\src),存在各種以#開(kāi)頭的語(yǔ)句,如下圖中所示。

Fluent UDF【6】:預(yù)處理命令【轉(zhuǎn)發(fā)】fluent仿真分析圖片1

這些以#開(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ù)處理程序完成一些操作。

2

文件包含命令

文件包含命令是以#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ù)處理命令,也將被處理。

3

宏定義和宏替換

#define開(kāi)始的行稱為宏定義命令行。宏定義包含兩種形式:

  • 簡(jiǎn)單宏定義

  • 帶參數(shù)宏定義

3.1 簡(jiǎn)單宏定義


簡(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)行了如下定義:

#define SLD static long double

伺候,宏名字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)單地完成文本替換工作。

3.2 帶參數(shù)的宏定義


帶參數(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ù),可定義宏:

#define min(A,B) ((A)<(B)?(A):(B))

若程序中出現(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)單的文本替換。

4

條件翻譯命令

條件編譯的作用是在源程序中劃出一些片段,使預(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,其使用形式有兩種:

define 標(biāo)識(shí)符 define (標(biāo)識(shí)符)

當(dāng)標(biāo)識(shí)符是有定義的宏名字時(shí),define(標(biāo)識(shí)符)將得到1,否則得到0。這種表達(dá)式常被作為條件編譯的條件。此外還有兩個(gè)預(yù)處理命令#ifdefifndef,他們相當(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í)符)*/

Fluent UDF【6】:預(yù)處理命令【轉(zhuǎn)發(fā)】fluent仿真分析圖片2

Fluent UDF【6】:預(yù)處理命令【轉(zhuǎn)發(fā)】fluent分析案例圖片3

周末有活動(dòng),提前更新~


轉(zhuǎn)自公眾號(hào):胡坤 CFD仿真之道

開(kāi)放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(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電磁分析 

編輯
在線報(bào)名:
  • 客服在線請(qǐng)直接聯(lián)系我們的客服,您也可以通過(guò)下面的方式進(jìn)行在線報(bào)名,我們會(huì)及時(shí)給您回復(fù)電話,謝謝!
驗(yàn)證碼

全國(guó)服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號(hào)金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點(diǎn)擊咨詢 點(diǎn)擊咨詢
項(xiàng)目QQ咨詢:點(diǎn)擊咨詢
email:kf@1cae.com