2012-05-08 39 views
7

thể trùng lặp:
“Backporting” nullptr to C++-pre-C++0x programsCách xác định nullptr để hỗ trợ cả C++ 03 và C++ 11?

Làm thế nào để xác định nullptr để hỗ trợ cả C++ 03 và C++ 11?

Mã dưới đây có được biên dịch bằng cả biên dịch C++ 03 và C++ 11 mà không thay đổi ý nghĩa của nullptr trong trình biên dịch C++ 11 không?

#include <cstddef> 

#if !defined(nullptr) 
#define nullptr NULL 
#endif 
+5

Có đúng không? Không thật sự lắm. Nếu 'NULL' tương đương với' nullptr', thì không có lý do gì để giới thiệu tính năng này ngay từ đầu. Bạn đang hỏi gì Liệu mã của bạn có * biên dịch * không? –

+4

Kiểm tra giải pháp này: http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander

+7

'được định nghĩa (nullptr)' sẽ không thành công, vì 'nullptr' là từ khóa, không phải là định nghĩa. – Griwes

Trả lời

10

Trong C++ 11, nullptr là loại nullptr_t. Một trong những lợi thế lớn của nó so với NULL (hoặc 0 sẽ nói Bjarne kể từ khi anh ấy không thích macro) là giữa hai chức năng:

void foo(char*); 
void foo(int); 

foo(nullptr) sẽ gọi quá tải char* nhưng foo(NULL) sẽ gọi quá tải int. Vì vậy, giải pháp của bạn có thể làm việc trong hầu hết các trường hợp, nhưng bạn có thể có lỗi với quá tải chức năng.

+7

Chắc chắn không phải là lợi thế * duy nhất *. Bạn có thể quá tải trên 'nullptr_t' quá, và đó là khá hữu ích. –

+3

Trích đối số mẫu khấu trừ 'nullptr_t' cho' nullptr' và 'int' cho' NULL'. –

8

AFAIK bạn không thể tự động hóa từ trong mã phát hiện hỗ trợ nullptr.

Trong thực tế, bạn có thể đọc đó là “ không thể ”, nó ’ s khá mạnh “ AFAIK ”.

Điều cần làm là sử dụng mã trình biên dịch cụ thể và/hoặc lệnh xây dựng. Ví dụ, trong mỗi nguồn có liên quan thêm một

#include <cpp/nullptr.h> 

và trong xây dựng lệnh điều chỉnh bao gồm đường dẫn để cho trình biên dịch với nullptr hỗ trợ, này nhặt một tiêu đề trống rỗng, trong khi đối với một trình biên dịch cũ mà thiếu nullptr, nó chọn một tiêu đề xác định nó à la Meyers (nói).

Và sau đó kiểm tra kỹ lưỡng!

Tôi gọi khái niệm chung là có nhiều phiên bản tiêu đề, chỉ với một phiên bản được chọn bởi lệnh xây dựng, một tiêu đề ảo . Có thể xây dựng rất nhiều máy móc xung quanh đó, bao gồm các quy ước chỉ có ý nghĩa trong một trường hợp tổng quát hơn. Vui lòng nó ’ s không cần thiết cho trường hợp cụ thể này, nhưng có lẽ đáng để biết.

Tổng hợp: tạo mã nguồn C++ làm những điều kỳ diệu không phải là cách để đến đây. Thêm một chút trợ giúp ở cấp độ xây dựng có vẻ đúng. :-)

+1

"AFAIK bạn không thể tự động hóa từ bên trong mã phát hiện hỗ trợ nullptr" ít nhất, không theo cách bao gồm các trình biên dịch không phù hợp, mà trong thực tế là xấp xỉ tất cả chúng. Trên các trình biên dịch phù hợp bạn có thể, vì trình biên dịch C++ 03 được đảm bảo không hỗ trợ 'nullptr' làm từ khóa, trong khi trình biên dịch C++ 11 được đảm bảo có nó. Vì vậy, tất cả những gì bạn cần làm là kiểm tra xem. –

+0

@Steve: có. :-) anh ấy anh ấy –

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