19

私は、たまたまSIZE_MAXいくつかの場所で使用されている既存の C++ コードベースに取り組んでいます。いくつかのリファクタリングを行いSIZE_MAXましたが、モジュールの 1 つで定義されていません。この問題は、Travis-CIが Linux でプロジェクトをビルドしようとしたときに発生しました。リファクタリングする前は問題なく動作していましたが、どのヘッダー ファイルが含まれていたかを正確に追跡することは困難です。

問題をローカルで再現しようとして、デフォルトの gcc を使用して Ubuntu VM をインストールし、再現することができました。関連するソースは次のとおりです。

#include <stddef.h>

int main()
{
    size_t a = SIZE_MAX;
}

コマンド ラインは次のとおりです。

g++ a.cpp

エラーは次のとおりです。

a.cpp: In function ‘int main()’:
a.cpp:5:16: error: ‘SIZE_MAX’ was not declared in this scope

システム情報:

$ uname -a
Linux quartz 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

cstdintstdint.hlimits.hinttypes.hstdio.hstdlib.hおよびおそらく他のいくつかを含めようとしましたが、 に必要な特定のヘッダー ファイルがわかりませんSIZE_MAX

私が取り組んでいるプログラムは、SIZE_MAXいくつかの変更を加える前に、さまざまな場所で使用され、正常にコンパイルされたことに注意することが重要です。私が行った変更により、それが使用された1 つの ソース ファイルで未定義になりました.cpp(他のファイルは引き続き問題ありません)。したがって、私のシステムには、正しく定義されているヘッダー ファイルがいくつか存在します。

4

3 に答える 3

17

以前に定義__STDC_LIMIT_MACROSされたヘッダーが含まれている可能性があります。__STDC_CONSTANT_MACROSstdint.h

Linux でコンパイルするとg++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp、古いコンパイラでこの問題が修正されるはずです。

これらのマクロについて詳しく知りたい場合は...

于 2015-05-27T03:54:50.583 に答える
3

SIZE_MAX を定義する C++ 標準ヘッダーはどれですか?

で定義されているはず<cstdint>ですが、オプションです。

GCC 5.1 を使用した Fedora 22 での結果は次のとおりです。

#include <cstdint>

// use SIZE_MAX

結果:

g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -c filters.cpp
In file included from /usr/include/c++/5.1.1/cstdint:35:0,
                 from filters.cpp:14:
/usr/include/c++/5.1.1/bits/c++0x_warning.h:32:2: error: #error This file requires  
compiler and library support for the ISO C++ 2011 standard. This support is currently
experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
filters.cpp: In constructor ‘Filter::Filter(BufferedTransformation*)’:
filters.cpp:305:36: error: ‘SIZE_MAX’ was not declared in this scope
  : Filter(attachment), m_firstSize(SIZE_MAX), m_blockSize(0), m_lastSize(SIZE_M
                                    ^

次のことを行う方が簡単で、2015 年になっても問題を引き起こしている移植性のないオプション性について心配する必要はありません。

#include <limits>

#ifndef SIZE_MAX
# ifdef __SIZE_MAX__
#  define SIZE_MAX __SIZE_MAX__
# else
#  define SIZE_MAX std::numeric_limits<size_t>::max()
# endif
#endif

試し__SIZE_MAX__てみると、おそらく切望しているコンパイル時定数に戻ります。でプリプロセッサで定義されているかどうかを確認できますcpp -dM < /dev/null | grep __SIZE_MAX__

numeric_limits<size_t>::max()(そして、コンパイル時の定数ではない方法/理由は別のC++の謎ですが、それは別の問題です)。

于 2015-09-02T02:57:44.800 に答える