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