C ++ 98 (211 byte) g ++ - 5 (Ubuntu 5.2.1-23ubfox1 ~ 12.04) 5.2.1 0151031
Tôi muốn xem tôi có thể làm tốt như thế nào trong C ++ mà không cần sử dụng bộ tiền xử lý. Chương trình này tạo ra 2.139.390.572 byte đầu ra, hầu hết là một thông báo lỗi.
template<int i,class S,class T>struct R{typedef R<i,typename R<i-1,S,S>::D,typename R<i-1,S,S>::D>D;};template<class S,class T>struct R<0,S,T>{typedef S D;};void f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}
me@Basement:~/src/junk$ ls -l a.C
-rw-rw-r-- 1 me me 211 Apr 27 21:44 a.C
me@Basement:~/src/junk$ g++-5 a.C -fmax-errors=1 2>a.C.errors.txt
me@Basement:~/src/junk$ ls -l a.C.errors.txt
-rw-rw-r-- 1 me me 2139390572 Apr 27 22:01 a.C.errors.txt
Ung dung:
template <int i, class S, class T>
struct R {
typedef R<i, typename R<i-1,S,S>::D, typename R<i-1,S,S>::D> D;
};
template <class S, class T>
struct R<0, S, T> {
typedef S D;
};
void f() {
R<27, float, R<24, int*const*, int>::D>::D &E = 4;
}
Chương trình này hoạt động bằng cách xác định một mẫu cấu trúc đệ quy R chứa một typedef D chứa hai bản sao của R. Điều này dẫn đến một tên loại phát triển theo cấp số nhân, được in đầy đủ trong thông báo lỗi. Thật không may, g ++ dường như bị nghẹt thở trong khi cố gắng in một thông báo lỗi dài hơn (1 << 31) byte. 2.139.390.572 byte là mức gần nhất mà tôi có thể đạt đến giới hạn mà không cần vượt qua. Tôi tò mò liệu có ai có thể điều chỉnh các giới hạn đệ quy và các loại tham số 27, float, 24, int*const*
để tiến gần hơn đến giới hạn không (hoặc tìm một trình biên dịch có thể in một thông báo lỗi thậm chí dài hơn).
Đoạn trích từ thông báo lỗi:
a.C: In function ‘void f()’:
a.C:1:208: error: invalid initialization of non-const reference of type
‘R<27, float, R<24, R<23, R<22, R<21, R<20, R<19, R<18, R<17, R<16, R<15,
R<14, R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5, R<4, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*, int* const*>, R<1, int* const*, int* const*> > >, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*, int* const*>, R<1, int* const*, int* const*> > > >, R<4, R<3, R<2,
R<1, int* const*, int* const*>, R<1,
...
int* const*, int* const*> > > > > > > > > > > > > > > > > > > > > > > >
>::D& {aka R<27, R<26, R<25, R<24, R<23, R<22, R<21, R<20, R<19, R<18,
R<17, R<16, R<15, R<14, R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5,
R<4, R<3, R<2, R<1, float, float>, R<1, float, float> >, R<2, R<1, float,
float>, R<1, float, float> > >, R<3, R<2, R<1, float, float>, R<1, float,
float> >, R<2, R<1, float, float>, R<1, float, float> > > >, R<4,
...
, R<1, float, float>, R<1, float, float> > >, R<3, R<2, R<1, float, float>,
R<1, float, float> >, R<2, R<1, float, float>, R<1, float, float> > > > > >
> > > > > > > > > > > > > > > > > > > > >&}’ from an rvalue of type
‘int’
template<int i,class S,class T>struct R{typedef R<i,typename
R<i-1,S,S>::D,typename R<i-1,S,S>::D>D;};template<class S,class T>struct
R<0,S,T>{typedef S D;};void
f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}
^
compilation terminated due to -fmax-errors=1.
2.139.390.572 byte / 211 byte = 10.139.291.8
gcc -Wall -pedantic
là rất khác với đồng bằng ol`gcc
khác vớitcc
có lẽ khác với một số trình biên dịch c khác.