Home > 言語 > C/C++ Archive

C/C++ Archive

なんぞこれ

  • 2008年7月20日 02:41
  • C/C++

よく判らないgoogle-ctemplateのユーティリティたちの紹介?

make_tpl_varnames_h

テンプレートファイル内から{{VARNAME}}、{{#SECNAME}}、{{TPLNAME}}形式で記述された名称を取得し、
それらを定数として定義したヘッダファイルを作成します。
使い方は以下。

$ cat test.tpl
<h2>{{CONTENT}}</h2>
<p>Copyright:{{COPYRIGHT}}</p>

$ make_tpl_varnames_h test.tpl

------ Checking test.tpl ------
No syntax errors detected in test.tpl
Creating ./test.tpl.varnames.h

$ cat test.tpl.varnames.h
//
// This header file auto-generated for the template
//    /path/to/templates/./test.tpl
// by make_tpl_varnames_h
// DO NOT MODIFY THIS FILE DIRECTLY
//
const char * const kt_CONTENT = "CONTENT";
const char * const kt_COPYRIGHT = "COPYRIGHT";

複数のテンプレートに同じ名前が使用されていて、それらのヘッダファイルを同時にインクルードしてしまうと、定数の重複定義エラーになってしまう。
さらに、複数のファイル内で同一ヘッダファイルを読み込むと、これまた重複定義エラーになってしまう。
※多重読み込み防止の制御(#ifndef XXX_H ~ #define XXX_H ~ #endif のやつ)がないため。
イマイチ使えない・・・。

template-converter

テンプレートのソースを実行バイナリ内に組み込みたい場合に使います。
通常通りにテンプレートファイルを作成し、以下の手順で文字列に変換して使用します。

$ cat test.tpl
<h2>{{CONTENT}}</h2>
<p>Copyright:{{COPYRIGHT}}</p>

$ template-converter

Need to specify template variable name.
Usage: template-converter <template-varname> [infile] [outfile]

$ template-converter test.tpl test.tpl out.txt

$ cat out.txt
// This file automatically generated by template-converter
// DO NOT EDIT!

#ifndef _TEST_TPL_H
#define _TEST_TPL_H

const string test_tpl (
"<h2>{{CONTENT}}</h2>\n"
"<p>Copyright:{COPYRIGHT}}</p>\n"
);

#endif /* _TEST_TPL_H */

要は、テンプレートの内容を文字列化し、定数として定義したヘッダファイルを作成するツール。
使えなくはないけどあんまいらない・・・

diff_tpl_auto_escape

指定されたエスケープと、ソース内のエスケープ修飾子が異なる箇所を出力する?
ドキュメント読んだり、実際に試してみても意味がよく判りませんでした。。。

AzaraC

今更だけど気になる記事を発見。(2006年年10月の記事)

■WebアプリをC++で開発するためのテンプレート・エンジンをオープンソースとして公開
http://itpro.nikkeibp.co.jp/article/NEWS/20061013/250667/

CGI++(これもC++でWebアプリを作るフレームワーク)とは違って、
メインとなるロジックと表示ロジックを分割することが出来る優れもの。
まぁ、要はJavaのServlet+JSPみたいなものですが。
但し、セッション管理はないみたいです。phpでも挟んで管理させれば問題ないですが。

ちなみに、agesrvは一度xmlで出力して、それをXSLTを用いてHTMLに変換するという二度手間作業でやってます。
せっかくC++で開発したのに変換で時間が掛かっていて本末転倒な状態。
主ロジックと表示ロジックを混同させたくはなかったので仕方ないんです。

JavaはWeb開発用の色々なフレームワークが存在していて開発が楽なのだけど
JavaはTomcatとかの導入がメンドクサイので嫌。
導入が楽なのはPerlやPHPだけど、あれは言語仕様が気に入らない。。。

AzaraCを使用するように直してみるかなー

設計が悪いとあとに響く

積み重なる修正でソースがもうスパゲティ状態。
まだまだ一部の機能しか実装できてないのにもう詰んだ…(チョットマテ

C/C++の勉強しながら進めていたので、あっちは構造体、こっちではクラスと統一性はないし
ひとつの関数内でデータの取得から加工まで一気にやろうとして5重ネストなんて箇所もあるし
無駄にインスタンス化してたり、共通化に失敗した類似関数がいくつもあったり…etc
悪い点を上げるときりがない。

このまま進めてもストレス溜まって発狂してしまいそうなので(嘘)
しっかりと設計しなおして再チャレンジしようかと考え中。

少なくともオブジェクト指向の概念に沿った作りにすべきで(ry
(始めはCで作ろうとしていたので、関数+構造体がメインだった)

開発規約

とりあえず規約みたいなものを作ってみました。
と言ってもまだまだ微量ですが。
しかも依然としてソースコードの公開には至っていないので
基本的には自分用のメモです。

命名規約
・変数名は用途が判ればOK。できれば variableName の形式にする。
・クラス名は ClassName の形式にする。
・C++用の関数(というよりメンバ関数)は MemberFuncName の形式にする。
・Cでも利用可能な関数(単なる関数)は func_name の形式にする。
文字列の扱いについて
・可能な限り AString ( std::stringを拡張したクラス。const char* との互換性を強化) を利用
・一時変数なら std::string でも良し。
・関数に文字列を渡す場合は、引数の型は char* または const char* にする。

あとドキュメントも作ってみました。
口ばかりで実は作ってないんじゃないのか!?と思われるのも嫌なので・・・
ドキュメントはこちら を参照

# MySQL++でバインド変数の使い方が判らない・・・

Index of all entries

Home > 言語 > C/C++ Archive

Search
iKnow!バッジ


Feeds

Return to page top