2010-09-21 9 views

Trả lời

19

GCC 4.4.1 không hỗ trợ nullptr.

Hỗ trợ cho nullptr đã được bổ sung trong GCC 4.6.0: http://gcc.gnu.org/gcc-4.6/changes.html

hỗ trợ thử nghiệm Cải tiến cho các tiêu chuẩn sắp tới C++ 0x ISO C++, bao gồm hỗ trợ cho nullptr (nhờ để Magnus Từ bên ngoài), noexcept, các công đoàn không hạn chế, dựa trên phạm vi cho vòng lặp (nhờ Rodrigo Rivas Costa), các chức năng bị xóa hoàn toàn và các nhà thầu di chuyển ngầm.

Đối với phiên bản trước của GCC, nếu bạn muốn thử nghiệm với nullptr bạn có thể thử các cách giải quyết trong SO câu hỏi này:

Can nullptr be emulated in GCC?

+0

Tôi đang sử dụng GCC và g ++ 4.8 và tôi không thể tìm thấy nullptr ..... – user997112

+10

Thêm -std = C++ 11 vào dòng lệnh GCC của bạn. – sjaensch

+2

vì trước GCC 4.6 không có nullptr, bạn có thể sử dụng "__null" –

3

tôi khuyên bạn không sử dụng nullptr như định nghĩa ở trên, bởi vì nó có thể nguy hiểm. Nếu bạn muốn sử dụng nullptr, câu lệnh sau phải đúng.

sizeof(nullptr) == sizeof(void*) == sizeof(any pointer) 

Tuy nhiên, sizeof(nullptr) (theo quy định ở trên) sẽ không tuân thủ quy tắc này. Nó sẽ thực sự đánh giá đến sizeof(bad nullptr) = 1.

Đây là triển khai chính xác.

#pragma once 

namespace std 
{ 
    //based on SC22/WG21/N2431 = J16/07-0301 
    struct nullptr_t 
    { 
     template<typename any> operator any *() const 
    { 
     return 0; 
    } 
    template<class any, typename T> operator T any:: *() const 
    { 
     return 0; 
    } 

#ifdef _MSC_VER 
    struct pad {}; 
    pad __[sizeof(void*)/sizeof(pad)]; 
#else 
    char __[sizeof(void*)]; 
#endif 
private: 
    // nullptr_t();// {} 
    // nullptr_t(const nullptr_t&); 
    // void operator = (const nullptr_t&); 
    void operator &() const; 
    template<typename any> void operator +(any) const 
    { 
     /*I Love MSVC 2005!*/ 
    } 
    template<typename any> void operator -(any) const 
    { 
     /*I Love MSVC 2005!*/ 
    } 
    }; 
static const nullptr_t __nullptr = {}; 
} 

#ifndef nullptr 
#define nullptr std::__nullptr 
#endif 
+0

có lẽ bạn nên xem xét cũng đảm bảo rằng sự liên kết là chính xác là tốt, nếu điều này là quan trọng với bạn –

+3

Yaroslav, có lẽ bạn nên xem xét viết mà không cần hét lên. :) –

2

tôi sử dụng -std = C++ 0x để kích hoạt tính năng nullptr với gcc 4.6.3

+0

Nhưng -std = C++ 0x không cho phép nullptr trong Gcc 4.4.x –

2

Nếu bạn không có gcc mới nhất mà hỗ trợ C++ 11, hãy thử sử dụng NULL thay vì của nullptr.