包含头文件后,之前定义的宏消失了

时间:2013-07-09 03:56:06

标签: c++ c macros

我有以下代码:

#ifndef min
#define min(a,b) (((a)< (b)) ? (a) : (b))
#endif

int test(){
    return min(0,1);
}

哪个有效。但是,如果我包含一些头文件(来自图形数据库,这个头文件的内容可以在这里找到:http://www.sparsity-technologies.com/dex),编译器会抱怨min没有定义,就像Dex.h刚刚取消了我的马克定义。

但是,Dex.h不包含任何未定义的语句。我无法移动宏定义,因为它实际上包含在另一个头文件中。

出了什么问题,我该怎么办?

#ifndef min
#define min(a,b) (((a)< (b)) ? (a) : (b))
#endif

#include "gdb/Dex.h"

int test(){
    return min(0,1);
}

我得到的编译错误是:

 test.c:9:16: error: 'min' was not declared in this scope

2 个答案:

答案 0 :(得分:3)

看起来你包括c++config.h,其中包含:

00307 // This marks string literals in header files to be extracted for eventual
00308 // translation.  It is primarily used for messages in thrown exceptions; see
00309 // src/functexcept.cc.  We use __N because the more traditional _N is used
00310 // for something else under certain OSes (see BADNAMES).
00311 #define __N(msgid)     (msgid)
00312 
00313 // For example, <windows.h> is known to #define min and max as macros...
00314 #undef min
00315 #undef max

进一步看,它似乎包含在

中包含的字符串中
# 39 "dex/includes/dex/gdb/common.h" 2

答案 1 :(得分:2)

据推测,该头文件#undef - 已提供min(直接或通过其中包含的其他头文件)。

以下是三种解决方案(按优先顺序递增):

  1. #define移至#include
  2. 下方
  3. 使用功能/模板而不是宏。
  4. 使用std::min,可在标准<algorithm>标题中找到。