一个MFC程序,在CXXXDoc.cpp中有如下的宏定义:
#if  COMPOSE_DATA_TYPE == 1
#if defined(VCG_CACHE) 
#undef VCG_CACHE
#endif
#define COMPOSE_DATA() ComposeData()
#endif
它使用了另一个类,在这个类的头文件中有如下定义:
#define VCG_CACHE
我COMPOSE_DATA_TYPE定义为1,编译的时候,发现在CXXXDoc认为VCG_CACHE没有定义,但是定义VCG_CACHE的类认为它是定义的,这是为什么?

解决方案 »

  1.   

    刚才又发现一个现象,如果把下面的宏:
    #if  COMPOSE_DATA_TYPE == 1
    #if defined(VCG_CACHE) 
    #undef VCG_CACHE
    #endif
    #define COMPOSE_DATA() ComposeData()
    #endif
    放到CXXXDoc.h中去,出现的情况正相反:定义VCG_CACHE的类认为VCG_CACHE没有定义,但是CXXXDoc认为它是定义的!
    为什么呢?
      

  2.   

    #if defined(VCG_CACHE) // 判断是否定义
    #undef VCG_CACHE       // 如果定义了就取消定义(这个有问题拉)
    #endif如果第一次定义了,下次你包涵这个头文件时,它就会取消定义;
    应当给头文件加防止重复定义的头
    #ifndef _头文件名_H
    #define _头文件名_H
    //  头文件的内容
    // 。。
    #endif 
      

  3.   

    上面说错了,如果把下面的宏:
    #if  COMPOSE_DATA_TYPE == 1
    #if defined(VCG_CACHE) 
    #undef VCG_CACHE
    #endif
    #define COMPOSE_DATA() ComposeData()
    #endif
    放到CXXXDoc.h中去,出现的情况:两个类都认为它是定义的!
    为什么呢?
      

  4.   

    哦, COMPOSE_DATA_TYPE 是什么时候定义的啊,
      

  5.   

    问题解决了:把它们全放到StdAfx.h中去就可以了:
    #define VCG_CACHE
    #if  COMPOSE_DATA_TYPE == 1
    #if defined(VCG_CACHE) 
    #undef VCG_CACHE
    #endif
    #define COMPOSE_DATA() ComposeData()
    #endif
    但是不太明白其中的原因!
      

  6.   

    COMPOSE_DATA_TYPE和#ifdef...#endif在一起。
    你的意思是不是说#ifdef...#endif“执行”完后又“执行”了另一个类中的define VCG_CACHE?