Boost C++ Libraries

PrevUpHomeNext

範例:一對一產生器

假設您正在編寫一個產生 C++ 程式碼的應用程式。如果您曾經這樣做過,您就會知道這並不容易。將大量的 C++ 程式碼嵌入字串字面值中非常笨拙。一個更好的解決方案是

  1. 編寫要產生的程式碼範本,在需要更改的地方留下佔位符號。
  2. 在您的應用程式中存取範本,並用適當的文字取代佔位符號。
  3. 寫入結果。

這很容易實現。您可以編寫特殊的逐字檔案,這些檔案就是 C++ 程式碼,除了檔案的第一行包含要產生的變數名稱。建立一個簡單的工具,它接受一個逐字檔案,並建立一個 cpp 檔案,其中包含一個 char* 變數,其名稱取自逐字檔案的第一行,其值是檔案的正確引用內容。

讓我們看看 Boost.Build 可以做些什麼。

首先,Boost.Build 並不知道「逐字檔案」是什麼。因此,您必須註冊一個新的目標類型。以下程式碼可以做到這一點

import type ;
type.register VERBATIM : verbatim ;

type.register 的第一個參數指定了聲明類型的名稱。按照慣例,它是大寫的。第二個參數是此類型檔案的後綴。因此,如果 Boost.Build 在來源列表中看到 code.verbatim,它就知道它是 VERBATIM 類型。

接下來,您告訴 Boost.Build 可以在一個建置步驟中將逐字檔案轉換為 C++ 檔案。《產生器》是一個建置步驟的範本,它將一種類型(或一組類型)的目標轉換為另一種類型。我們的產生器將被稱為 verbatim.inline-file;它將 VERBATIM 檔案轉換為 CPP 檔案。

import generators ;
generators.register-standard verbatim.inline-file : VERBATIM : CPP ;

最後,您必須告知 Boost.Build 進行此轉換所使用的 shell 命令。這是通過 actions 聲明完成的。

actions inline-file
{
    "./inline-file.py" $(<) $(>)
}

現在,我們準備好將所有內容整合在一起。將以上所有程式碼放入檔案 verbatim.jam 中,將 import verbatim ; 新增到 Jamroot.jam 中,就可以在您的 Jamfile 中編寫以下內容

exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;

列出的逐字檔案將自動轉換為 C++ 原始碼檔案,編譯後再連結到 codegen 可執行檔。

在後續章節中,我們將擴展此範例,並詳細回顧所有機制。完整的程式碼可在 example/customization 目錄中找到。


PrevUpHomeNext