2012-03-07 34 views
11

Tôi cố gắng để phân bổ một kích thước cố định trên ngăn xếp để một mảng số nguyênLàm thế nào để chuyển đổi int để const int để gán kích thước mảng trên stack?

#include<iostream> 
using namespace std; 

int main(){ 

    int n1 = 10; 
    const int N = const_cast<const int&>(n1); 
    //const int N = 10; 
    cout<<" N="<<N<<endl; 
    int foo[N]; 
    return 0; 
} 

Tuy nhiên, điều này mang lại một lỗi trên dòng cuối cùng mà tôi đang sử dụng để xác định một N cố định
error C2057: expected constant expression.

Tuy nhiên, nếu tôi xác định Nconst int N = 10, mã sẽ biên dịch tốt. Tôi nên nhập số n1 như thế nào để truy cập số const int?

Tôi đã thử:const int N = const_cast<const int>(n1) nhưng có lỗi.

EDIT: Tôi đang sử dụng MS VC++ 2008 để biên dịch ... với g ++ nó biên dịch tốt.

Trả lời

17

Tôi nên nhập số n1 để xử lý số const int như thế nào?

Bạn không thể, không vì mục đích này.

Kích thước của mảng phải được gọi là Biểu thức hằng số không đổi (ICE). Giá trị phải được tính toán tại thời gian biên dịch. Một const int (hoặc đối tượng kiểu số nguyên khác đủ điều kiện const) có thể được sử dụng trong một Biểu thức Không đổi Integral chỉ khi nó được khởi tạo với một Biểu thức Không đổi Integral.

Một đối tượng không phải const (như n1) không thể xuất hiện ở bất kỳ đâu trong Biểu thức liên tục không đổi.

Bạn đã cân nhắc sử dụng std::vector<int>?

[Lưu ý - Diễn viên hoàn toàn không cần thiết. Cả những điều sau đây đều giống hệt nhau:

const int N = n1; 
const int N = const_cast<const int&>(n1); 

--End Note]

+2

Chỉ cần thêm chi tiết thêm một: gcc biên dịch nó như là một phần mở rộng - trong thực tế, nó cho phép các biểu thức khác mà không phải là ngay cả khi gần phù hợp, như 'int x (int a) {int b [a]; } ' –

+0

Ah, cảm ơn bạn, @JerryCoffin. Tôi không thấy bản chỉnh sửa khi tôi đăng. –

3

Chỉ mảng kích thước cố định có thể được phân bổ như vậy. Hoặc cấp phát bộ nhớ động (int* foo = new int[N];) và xóa nó khi bạn đã hoàn tất, hoặc (tốt hơn) sử dụng std::vector<int> để thay thế.

(Edit: GCC accepts that as an extension, nhưng nó không phải là một phần của chuẩn C++.)

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