none
使用宏生成多套代码的方法 RRS feed

  • 问题

  • 请见谅,标题可能描述的不是很清楚。

    如果您手头有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 会被忽略。对于此问题,哪位有解法么?
    2011年10月13日 6:51

答案

  • 如果想实现不同代码版本最基础的的是通过宏标识不同的代码段

    然后根据不同的标识设置编译出不同的版本

    如果程序达到一定规模多用一两个文件是无所谓的事情

    关键是使用复合自己思维习惯的方法

    • 已标记为答案 Rob Pan 2011年10月19日 8:56
    2011年10月14日 1:40