c ++在Linux中包含<bitset>,并且gcc引发<bitset>中发生的错误吗?

时间:2018-11-22 06:39:16

标签: c++ std bitset

我尝试在我的c ++代码中使用位集,所需的行为是我的代码人通过编译并正确使用位集。

具体问题是在编译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"));
          }
      }

1 个答案:

答案 0 :(得分:2)

很难从这个代码段中说出来,但是在系统头文件中发生语法错误的唯一原因几乎就是您的代码定义了一个与代码有些冲突的宏。

这里最有可能的候选人是min。不幸的是,这个名字的宏得到了广泛的应用。例如windows.h定义一个,除非您在包含NOMINMAX之前先定义它。还有其他标头执行相同的操作。

您可以诊断出来的一件事是在源文件中的每个个人之后放置以下代码段:

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

然后,一旦知道哪个标头负责,就可以尝试找出如何防止它执行此操作(或在必要时#undef宏)。