Fluent UDF【6】:預處理命令【轉發(fā)】

2017-07-05  by:CAE仿真在線  來源:互聯(lián)網

今天要講的內容是關于C語言的預處理。搞清楚了這個,就可以分析UDF中的各種頭文件源代碼,從此寫UDF不求人。

本文部分內容參考自《程序設計與C語言引論》第2版。

1

關于預處理

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

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

這些以#開頭的語句就是C語言的預處理命令。
C語言的預處理工作由一個預處理程序來完成,任何C系統(tǒng)都有一個預處理程序,其負責處理源程序中的所有預處理命令,從而生成不含預處理命令的源程序。C語言的預處理目的是為了方便編程。

預處理命令以獨立的預處理命令行的形式出現在源程序中,# 是其特殊的引導符號。如果源程序中某一行的第一個非空格符號是 # ,這就是一個預處理命令行。預處理命令的作用是要求預處理程序完成一些操作。

2

文件包含命令

文件包含命令是以#include開始的行,其作用是把特定文件的內容復制到當前源文件中。其存在兩種形式:

# include <文件名> # include "文件名"

兩者的差異在于文件搜索方式的不同。
第一種形式,預處理程序直接到系統(tǒng)指定的某些目錄中去查找所需文件,目錄指定方式由具體系統(tǒng)確定,通常指定幾個系統(tǒng)目錄。
第二種形式,預處理程序現在源文件所在目錄中查找,若沒找到文件則再到系統(tǒng)指定的目錄中去查找。
文件包含命令的處理過程:首先查找所需文件,找到后就用該文件的內容取代這個包含命令行。替換進來的文件中若有預處理命令,也將被處理。

3

宏定義和宏替換

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

  • 簡單宏定義

  • 帶參數宏定義

3.1 簡單宏定義


簡單宏定義的形式為:
#define 宏名字 替代文本
其中宏名字是任意標識符,替代文本可以是任意一段正文,其中可以包括程序中能出現的任何字符(包括空格等),一直延續(xù)到本行結束。如果需要寫多行的替代文本,可以在行末寫一個反斜杠\,這將使下一行內容繼續(xù)被當做替代文本。
宏定義的作用就是為宏名字定義替代。
如果一個宏名字的替代文本是數值或可以靜態(tài)求值的表達式,當這個宏名字在程序某處出現,就相當于在那里寫了這個數值或表達式。
例如,如果進行了如下定義:

#define SLD static long double

伺候,宏名字SLD就代表static long double。若程序中出現:

SLD x=2.4, y=9.16;

經過預處理后,源代碼被翻譯為:

static long double x=2.4,y=9.16;

預處理并不檢查宏定義中的替代文本是否為合法的C語言結構,也不檢查替換之后的結果是否為正確的C語言程序段,其只是簡單地完成文本替換工作。

3.2 帶參數的宏定義


帶參數的宏定義形式為:
#define 宏名字(參數列表) 替代正文
使用帶參宏時,不但要給出宏的名字,還要用類似函數實參的形式給出各宏參數的替代段,多個替代段之間用逗號分隔。這種形式也成為一個宏調用。
對宏調用的替換分兩部分進行:首先用實際替代段去替換宏定義的替代正文里出現的各個宏參數,然后把替換的結果(展開后的替代正文)代入程序里出現宏調用的為準。
例如,定義求兩個數據中較小數,可定義宏:

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

若程序中出現如下語句:

z = min(x+y,x*y)

則宏展開后則為:

z = ((x+y)<(x*y)?(x+y):(x*y));

帶參數的宏定義與函數看起來很類似,但實際上有很大的不同。切記宏定義只是簡單的文本替換。

4

條件翻譯命令

條件編譯的作用是在源程序中劃出一些片段,使預處理程序可根據條件保留或丟掉一段,或從幾段中選擇一段保留。實現條件編譯的預處理命令有四個,分別是:

#if #else #elif #endif

其中,#if#elif命令以一個能靜態(tài)求出整型值的表達式為參數。另外兩個沒有參數。條件編譯命令的常見使用形式有三種:

形式一

#if 整形表達式 …… /*代碼片段,條件成立時保留*/ #endif

形式二

#if 整形表達式 …… /*條件成立時保留*/ #else …… /*條件不成立時保留*/ #endif

形式三

#if 整形表達式 …… /*條件成立時保留*/ #elif 整形表達式 …… /*elif部分,可以有多個*/ #elif 整形表達式 …… #else …… /*條件都不成立時保留*/ #endif

其中整形表達式是預處理條件,值為0表示條件不成立,否則條件成立。這里常用==,!=等做判斷,例如判斷宏定義的符號是不是等于某個值等。
為了方便,C語言提供了一個特殊謂詞
defined,其使用形式有兩種:

define 標識符 define (標識符)

當標識符是有定義的宏名字時,define(標識符)將得到1,否則得到0。這種表達式常被作為條件編譯的條件。此外還有兩個預處理命令#ifdefifndef,他們相當于#if和#define混合的簡寫形式。

#ifdef 標識符 /*相當于#if define(標識符)*/ #ifndef 標識符 /*相當于#if !define(標識符)*/

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

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

周末有活動,提前更新~


轉自公眾號:胡坤 CFD仿真之道

開放分享:優(yōu)質有限元技術文章,助你自學成才

相關標簽搜索:Fluent UDF【6】:預處理命令【轉發(fā)】 Fluent培訓 Fluent流體培訓 Fluent軟件培訓 fluent技術教程 fluent在線視頻教程 fluent資料下載 fluent分析理論 fluent化學反應 fluent軟件下載 UDF編程代做 Fluent、CFX流體分析 HFSS電磁分析 

編輯
在線報名:
  • 客服在線請直接聯(lián)系我們的客服,您也可以通過下面的方式進行在線報名,我們會及時給您回復電話,謝謝!
驗證碼

全國服務熱線

1358-032-9919

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