2011-10-28 38 views
8

thể trùng lặp:
Is it possible to print out the size of a C++ class at compile-time?In ấn sizeof (T) tại thời gian biên dịch

Tôi có thể đầu ra kích thước của một đối tượng ở thời gian biên dịch? Vì trình biên dịch đã có thông tin này khi nó đang biên dịch một tệp nguồn, tôi có thể xem nó (tại thời gian biên dịch) thay vì trải qua quá trình kéo dài kích thước ở đâu đó trong bảng điều khiển của ứng dụng hay cửa sổ gỡ lỗi?

Điều này sẽ rất hữu ích đặc biệt là khi tôi có thể biên dịch các tệp nguồn duy nhất giúp tôi tiết kiệm rất nhiều thời gian khi làm việc trên các dự án lớn.

+0

Đây có phải là những gì bạn đang tìm kiếm không? http://stackoverflow.com/questions/2008398/is-it-possible-to-print-out-the-size-of-ac-class-at-compile-time – birryree

+0

Nhiều trình biên dịch có '# pragma' hoặc các trình biên dịch khác chỉ thị có thể được sử dụng để xuất các giá trị trong quá trình biên dịch. Bạn sẽ phải kiểm tra tài liệu của trình biên dịch. Thật không may tôi không biết làm thế nào để có được trình biên dịch để đánh giá biểu thức trước khi nó tạo ra đầu ra. –

+0

Không, đó là câu hỏi khác. –

Trả lời

19

Có. Các bản sao có thể in kích thước như lỗi tin nhắn, có nghĩa là việc biên dịch sẽ không thành công.

Tuy nhiên, giải pháp của tôi in kích thước là cảnh báo tin nhắn, có nghĩa là, nó sẽ in kích thước và quá trình biên dịch sẽ tiếp tục.

template<int N> 
struct print_size_as_warning 
{ 
    char operator()() { return N + 256; } //deliberately causing overflow 
}; 

int main() { 
     print_size_as_warning<sizeof(int)>()(); 
     return 0; 
} 

nhắn Warning:

prog.cpp: In member function ‘char print_size_as_warning<N>::operator()() [with int N = 4]’: 
prog.cpp:8: instantiated from here 
prog.cpp:4: warning: overflow in implicit constant conversion 

Demo: http://www.ideone.com/m9eg3

Lưu ý: giá trị của N trong thông điệp cảnh báo là giá trị của sizeof (int)


Mã trên được cải thiện một và lần đầu tiên của tôi nỗ lực là thế này:

template<int N> 
struct _{ operator char() { return N+ 256; } }; //always overflow 

int main() { 
     char(_<sizeof(int)>()); 
     return 0; 
} 

nhắn Cảnh báo:

prog.cpp: In member function ‘_<N>::operator char() [with int N = 4]’: 
prog.cpp:5: instantiated from here 
prog.cpp:2: warning: overflow in implicit constant conversion 

Demo: http://www.ideone.com/mhXjU

Ý tưởng được lấy từ câu trả lời trước của tôi cho câu hỏi này:

+1

Tuyệt vời, cảm ơn. – Samaursa

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