c++ 在 linux 中包含 <bitset>,而 gcc 引发在 <bitset> 中发生的错误?

c++ Include <bitset> in linux, and gcc raises error which occurs within <bitset>?

我尝试在我的 C++ 代码中使用 bitset,期望的行为是我的代码通过编译并正确使用 bitset。

具体问题是在编译 gcc 时引发此问题:

g++ -g -Wall -Wshadow -I../bin -I../filesys -I../userprog -I../threads -I../machine -DUSER_PROGRAM -DFILESYS_NEEDED -DFILESYS_STUB  -DHOST_i386 -DCHANGED  -c ../threads/synch.cc
In file included from ../machine/machine.h:28:0,
                 from ../threads/thread.h:47,
                 from ../threads/synch.h:21,
                 from ../threads/synch.cc:26:
/usr/include/c++/4.6/bitset: In member function 'void std::bitset<_Nb>::_M_copy_from_ptr(const _CharT*, std::size_t, std::size_t, std::size_t, _CharT, _CharT)':
/usr/include/c++/4.6/bitset:1371:30: error: expected unqualified-id before '(' token
/usr/include/c++/4.6/bitset:1371:30: error: expected unqualified-id before '(' token
/usr/include/c++/4.6/bitset:1371:30: error: expected unqualified-id before '(' token

“'(' 令牌之前的预期不合格 ID”是什么意思,我该如何解决这个问题?

1371 行文件位集是:

// Definitions of non-inline member functions.
  template<size_t _Nb>
    template<class _CharT, class _Traits>
      void
      bitset<_Nb>::
      _M_copy_from_ptr(const _CharT* __s, size_t __len,
                       size_t __pos, size_t __n, _CharT __zero, _CharT __one)
      {
        reset();
        const size_t __nbits = std::min(_Nb, std::min(__n, __len - __pos));
        for (size_t __i = __nbits; __i > 0; --__i)
          {
            const _CharT __c = __s[__pos + __nbits - __i];
            if (_Traits::eq(__c, __zero))
              ;
            else if (_Traits::eq(__c, __one))
              _Unchecked_set(__i - 1);
            else
              __throw_invalid_argument(__N("bitset::_M_copy_from_ptr"));
          }
      }

仅从这个片段很难说,但系统 headers 中发生语法错误的唯一原因几乎是您的代码定义了一个与代码有某种冲突的宏。

这里最有可能的候选人是min。不幸的是,这个名字的宏相当 wide-spread;例如windows.h 定义一个,除非您在包含它之前定义 NOMINMAX。还有其他 header 做同样的事情。

诊断此问题的一件事是将此代码片段放在源文件中每个包含的个体之后:

#if defined(min)
#error Previous include defined min
#endif

然后,一旦您知道是哪个 header 负责,您就可以尝试找出如何防止它这样做(或在必要时 #undef 宏)。