请见谅,标题可能描述的不是很清楚。
如果您手头有More Exceptional C++一书,请看一下第259页,其中描述了一个ERR_ENTRY宏。大意为通过宏重定义,从一份文本生成两份不同的代码。
例如有如下 文本:
BEGINENUM(CppDataType)
ENUMITEM(CppUnknow, unknow)
ENUMITEM(CppInt32, int)
ENUMITEM(CppUint32, unsigned int)
ENDENUM
通过定义宏 BEGINENUM、ENUMITEM、ENDENUM,生成两份不同的代码:
1.
enum EnumCppDataType
{
CppUnknow,
CppInt32,
CppUint32,
}
2.
struct EnumItem
{
int val;
string str;
}
EnumItem EnumEntityOfCppDataType[] =
{
{CppUnknow, "CppUnknow"},
{CppInt32, "CppInt32"},
{CppUint32, "CppUint32"},
}
在实际中,这种手法是很有好处的——就算有相关的多段代码,也不必担心同 步。
但实际中,似乎有些困难。
我之前使用过一次,操作方法是:
1. 将待替换文本写到一个文本文件中(非头文件),其中不包含#Progma once
2. 生成一个头文件:在其中先定义三个宏,然后#include 文本文件
3. 生成一个CPP文件:先#include 头文件;再重新定义三个宏,然后#include 文本文件
cpp文件需要先导入头文件是因为 EnumEntityOfCppDataType中需要使用枚举值,因此需要用头文件来引入枚举定义。
我的问题在于,我不想使用三个文 件。
1. 哪位有一个文件就搞定的方法么?
2. 退而求其次,用两个文件呢?我尝试这么作:把文本直接写在头文件中,然后CPP中两次#include 头文件,一次生成枚举定义EnumCppDataType,一次生成EnumEntityOfCppDataType。但有个很恼火的问题:头文件 有#progma once 标记,第二次#include 会被忽略。对于此问题,哪位有解法么?