2013-09-23 38 views
5

Tôi đã tình hình rất lạ sau đây ... Visual Studio của tôi biên dịch 2010 không thích đoạn mã sau:Visual Studio 2010 C++ biên dịch vấn đề

QStringList lst2 = instantiatedTableInstances.split(strComma, skipper); 

    for(int i=0; i<lst2.size(); i++) 
    { 
     TableInstance* tabInst= v->getTableInstance(lst2.at(i)); 
     result->addInstantiatedTableInstance(tabInst); 
    } 

nó mang lại cho tôi:

..\src\DeserializationFactory.cpp(1196) : error C2143: syntax error : missing ';' before 'constant' 
..\src\DeserializationFactory.cpp(1196) : error C2440: '=' : cannot convert from 'QStringList' to 'int' 
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
..\src\DeserializationFactory.cpp(1198) : error C2228: left of '.size' must have class/struct/union 
    type is 'int' 
..\src\DeserializationFactory.cpp(1200) : error C2228: left of '.at' must have class/struct/union 
    type is 'int' 

và một ảnh chụp màn hình:

VS2010 error

NHƯNG nếu tôi đổi tên biến để lst thay vì lst2 tất cả mọi thứ biên dịch ...

Đây có phải là một lỗi hài hước trong Visual Studio 2010 (vì GCC không quan tâm về điều đó) hoặc có một lý do ẩn hơn cho việc này?

+0

Kiểm tra xem lst2 chưa được xác định/khai báo/macro trong phạm vi chưa. – user2672165

+1

lst2 là macro. Từ ảnh chụp màn hình có vẻ như nó có màu sắc khác nhau, nên cho nó đi – relaxxx

+1

Mẹo: Cố định bằng cách xác định 'WIN32_LEAN_AND_MEAN'. – MSalters

Trả lời

12

Các loại lỗi này thường là kết quả của một macro không mong muốn có cùng tên biến của bạn. Một chút của google sẽ tìm thấy bạn dòng này trong tiêu đề của Windows SDK Dlgs.h:

#define lst2  0x0461 

Đó là cái mà tôi gọi tên ô nhiễm!

tôi đoán là MS mọi người nghĩ rằng việc sử dụng một ID khác nhau cho các điều khiển của mỗi hộp thoại gì khó khăn để duy trì, và vì vậy họ mặc dù đưa ra danh sách các bất kỳ thoại ID giống nhau: lst1, lst2, lst3. .. lst16. Và tương tự với bất kỳ loại điều khiển nào khác. Nhưng vì lý do nào đó ý tưởng không bắt được và tiêu đề Dlgs.h đã bị lãng quên.

Bây giờ, điều kỳ lạ là tiêu đề này được bao gồm theo mặc định trong dự án VC++ của bạn chứ không phải trong trình biên dịch GCC của bạn. Có lẽ môi trường không giống nhau.

+0

Bạn đánh tôi với nó; có +1. * Ví dụ chính * về những gì sai với các macro. – Angew

+2

@Angew: Mọi người đều biết rằng macro là điều xấu. Nhưng nếu nó có tên 'WIN32_DLG_DEFAULT_LIST_2' thì không ai quan tâm. Sử dụng 'lst2' làm tên macro là điều ác và ngu xuẩn. – rodrigo

+0

Bộ tiền xử lý được xác định trong ' 'đang được sử dụng. Chúng là các hằng số biểu tượng cho ID điều khiển được sử dụng trong các hộp thoại chung (như Hộp thoại mở tệp). Nếu bạn muốn tùy chỉnh một hộp thoại chung, bạn sẽ cần những ID đó (xem [Quy trình móc kiểu Explorer] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646960.aspx#_win32_Explorer_Style_Hook_Procedures)) . Thêm vào đó, việc gán một ID khác nhau cho mọi điều khiển trong mỗi hộp thoại thực sự là không thể. Kiểm soát ID được giới hạn trong 16 bit. – IInspectable

0

có vẻ như bạn đã có một biến được gọi là lst, có một loại int. có, tôi đồng ý nó trông giống như một lỗi của trình biên dịch, vì bạn đang ở trong một không gian biến mới với if (secondStep) {} gói.

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