Skip to content

Instantly share code, notes, and snippets.

@sksat
Created May 9, 2017 08:17
Show Gist options
  • Save sksat/185880ec3521454fccdc85a1ea7eb2c0 to your computer and use it in GitHub Desktop.
Save sksat/185880ec3521454fccdc85a1ea7eb2c0 to your computer and use it in GitHub Desktop.
C++でmksrcを使わずにKHPCを使う方法(手抜き)
#ifndef PERSISTENT_HPP_
#define PERSISTENT_HPP_
extern "C" {
#include "khpc0.h"
void persistent_default(){
persistent_grp(256, "p-vars.pbd", "p-vars_%x.pbd", "(local)");
return;
}
};
#define TO_STRING(v) # v
#define persistent(v) persistent_def(v, TO_STRING(v))
template<typename T>
void persistent_def(T &t, const char *id){
persistent_def(&t, sizeof(T), 256, id);
}
#endif
@sksat
Copy link
Author

sksat commented May 9, 2017

mksrcでやっていたことは、
・変数名の取得(IDにするため)
・persistent_default()の生成
 persistent_defaultは永続変数の保存グループの設定と、永続変数の一括登録(persistent_def呼び出し)

@sksat
Copy link
Author

sksat commented May 9, 2017

mksrcを使用する場合、persistent指定した変数はpersistent_default(正確にはpersistent_default_ファイル名_c)関数によってpersistent_load(これも正確にはpersistent_noload)の初回呼び出し時に一括登録(persistent_def)される。
しかし、登録はプログラムの初めに行う必要は無い(mksrcを使わず、persistent_defを直接呼び出しての登録も許されているため)。

@sksat
Copy link
Author

sksat commented May 9, 2017

このため、コンパイル時の変数名の文字列取得が自動でできれば、その文字列を使ってpersistent_defを呼ぶことで、mksrcを使用した場合と同等のことができるはず。

@sksat
Copy link
Author

sksat commented May 9, 2017

そこで、コンパイル時の変数名取得はTO_STRINGマクロ、任意の型の変数の登録はtemplateを使いで、KHPCに追加するだけで簡単にKHPC互換のpersistent-C++ができるようにしてみた(C++用パッチ的なかんじ?)

@sksat
Copy link
Author

sksat commented May 9, 2017

ビルド

gcc -c khpc0.c
g++ -c test.cc
g++ -o test test.o khpc0.o

@sksat
Copy link
Author

sksat commented May 9, 2017

注意

persistent_loadした後に新たな変数の永続化をしようとすると、

persistent_def: setting after load: 変数名

と怒られる

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment