2015-05-27 18 views
11

Tôi đang làm việc trên một codebase C++ hiện có xảy ra để sử dụng SIZE_MAX ở một vài nơi. Tôi đã làm một số refactoring và bây giờ SIZE_MAX không được định nghĩa trong một trong các mô-đun. Vấn đề này xuất hiện khi Travis-CI cố gắng xây dựng dự án trên Linux. Nó làm việc tốt trước khi tôi refactored công cụ, nhưng truy tìm các tập tin tiêu đề chính xác đã được bao gồm là khó khăn.Tiêu đề chuẩn C++ nào định nghĩa SIZE_MAX?

Trong một nỗ lực để nhân rộng vấn đề cục bộ, tôi đã cài đặt một máy ảo Ubuntu với gcc mặc định và có thể tái tạo nó. Dưới đây là các nguồn có liên quan:

#include <stddef.h> 

int main() 
{ 
    size_t a = SIZE_MAX; 
} 

Các dòng lệnh đơn giản là:

g++ a.cpp 

Lỗi này là: info

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

hệ thống:

$ 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 

Tôi đã cố gắng bao gồm cstdint, stdint.h, limits.h, inttypes.h, stdio.h, stdlib.h và có thể một số khác và tôi không thể tìm ra tệp tiêu đề cụ thể nào tôi cần cho SIZE_MAX. Điều quan trọng cần lưu ý là chương trình tôi đang làm việc trên tiền phạt biên soạn, với SIZE_MAX được sử dụng ở nhiều nơi khác nhau, trước khi tôi thực hiện một số thay đổi. Những thay đổi tôi đã thực hiện khiến nó trở thành không xác định trong một.cpp tệp nguồn nơi tệp được sử dụng (các tệp khác tiếp tục được sử dụng). Vì vậy, tồn tại một số tệp tiêu đề trên hệ thống của tôi nơi tệp được xác định chính xác.

+0

Bạn đã thử 'cstdint' ... section * [cstdint.syn] * nói rằng nó nên ở đó nhưng nó cũng phải ở trong' stdint.h'. –

+1

@ShafikYaghmour: Tôi có, và trình biên dịch cảnh báo tôi rằng bao gồm tiêu đề đó yêu cầu chuyển đổi '-std = C++ 0x', nhưng đây không phải là chương trình C++ 11 và tôi không muốn thay đổi điều đó. Nó vẫn không tìm thấy 'SIZE_MAX' khi bao gồm' cstdint'. –

+0

Hãy xem https://groups.google.com/forum/#!msg/snap-discuss/giu_IMZndxI/CYP98BGvf7QJ – Santhucool

Trả lời

8

Có thể một số tiêu đề được xác định __STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS trước khi stdint.h được bao gồm.

Biên dịch trên Linux với g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp nên khắc phục vấn đề này trên các trình biên dịch cũ hơn.

If you'd like to learn more about these macros...

+0

Huh, đã hoạt động!Ít nhất là trên hệ thống của tôi cho chương trình thử nghiệm. Tôi sắp thử nó với chương trình thực sự trên Travis-CI. –

+1

Điều đó thực sự hiệu quả. Tôi đã thêm '#define __STDC_LIMIT_MACROS' trước khi bao gồm lần đầu tiên trong tệp nguồn sự cố và sau đó nó được biên dịch thành công. –

7

18.4.1 Tiêu đề < cstdint> tóm tắt

Phần header cũng định nghĩa nhiều macro có dạng:

int_ [NHANH NHẤT] {8 16 32 64} _MIN

[U] INT_ [NHANH CHÓNG] {8 16 32 64} _MAX

INT {MAX PTR} _MIN

[U] INT {MAX PTR} _MAX

{PTRDIFF SIG_ATOMIC WCHAR Wint} {_ MAX _MIN}

SIZE_MAX

EDIT

Trong tiêu chuẩn C++ 11/14 hiện tại, SIZE_MAX được giới thiệu và nam giới chỉ được ghi nhận trong <cstdint>. Nó cũng là một phần của C99, trong đó đặc tả C++ 11 bao gồm đầy đủ thông qua các tiêu đề <cxxx>. Vì vậy, có vẻ như nó không được xác định trước khi C++ 11.

+1

@GregHewgill tiếc là tôi không có bản sao tiêu chuẩn C++ 98/03. Tôi thậm chí không chắc chắn nó đã được xác định trước đó. Tôi nghĩ rằng nó được xác định bởi tiêu chuẩn C99, và afaik, C++ 11 hoàn toàn bao gồm các thông số kỹ thuật C99. – vsoftco

+0

@vsoftco: C++ 2003 không bao gồm 'cstdint' và do đó không bao gồm' SIZE_MAX'. –

+0

@BillLynch Vâng đó là những gì tôi đã nói về cơ bản, rằng nó dường như mới được giới thiệu trong C++ 11 (mặc dù nó là một phần của C99 trước đây). – vsoftco

1

nào chuẩn C++ tiêu đề định nghĩa SIZE_MAX?

Nghĩa vụ phải được xác định trong <cstdint>, nhưng tùy chọn của nó.

Sau đây là các kết quả trên Fedora 22 với GCC 5.1:

#include <cstdint> 

// use SIZE_MAX 

Kết quả trong:

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 
            ^

Nó chỉ đơn giản là dễ dàng hơn để làm những điều sau đây, và đừng lo lắng về bắt buộc- không cầm tay Ness vẫn gây ra sự cố trong nă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 

Thử __SIZE_MAX__ ge ts bạn trở lại thời gian biên dịch liên tục mà bạn có thể thèm muốn. Bạn có thể xem nếu nó được xác định trong bộ tiền xử lý với cpp -dM < /dev/null | grep __SIZE_MAX__.

(Và làm thế nào/tại sao numeric_limits<size_t>::max()không một thời gian biên dịch liên tục là một C++ bí ẩn, nhưng đó là một vấn đề khác nhau).

+0

"' numeric_limits :: max() 'không phải là hằng số thời gian biên dịch" - với chuẩn nào? http://en.cppreference.com/w/cpp/types/numeric_limits/max cho biết đó là constexpr kể từ C++ 11 (nhờ gợi ý cho người dùng 1913600 - romain-b). – osgx

Các vấn đề liên quan