2010-04-08 29 views
6

Đoạn mã sau đây tạo cảnh báo C6284 khi được biên dịch với /analyze trên đối tượng MSVC 2008: được chuyển thành tham số '% s' khi chuỗi được yêu cầu trong hàm gọi hàm.Làm thế nào để ngăn chặn C6284 khi sử dụng CString :: Format?

CString strTmp, str; 
str = L"aaa.txt" 
strTmp.Format (L"File: %s", str); 

Tôi đang tìm kiếm một giải pháp tốt đẹp cho này mà không đòi hỏi static_cast

Trả lời

6

Microsoft mô tả việc sử dụng CString với chức năng lập luận biến here:

CString kindOfFruit = "bananas"; 
int  howmany = 25; 
printf_s("You have %d %s\n", howmany, (LPCTSTR)kindOfFruit); 

Là một thay thế bạn cũng có thể sử dụng phương pháp PCXSTR CString::GetString() const; để cố khắc phục cảnh báo:

CString strTmp, str; 
str = L"aaa.txt" 
strTmp.Format (L"File: %s", str.GetString()); 
+0

Tôi có sai hay giải pháp đúng là sử dụng 'str.GetBuffer()'? – sorin

+1

Bạn có thể sử dụng cả cho tình huống của mình, nhưng chúng có ý nghĩa khác nhau đối với người đọc. 'GetBuffer()' trả về một bộ đệm chuỗi cho phép sửa đổi trực tiếp (không phải 'const') của đối tượng' CString' trong khi 'GetString()' trả về một bộ đệm 'const' để truy cập chỉ đọc. –

3

Một trong những lỗi thiết kế của CString, err, các tính năng là nó có tính năng chuyển đổi ẩn thành LPCTSTR làm cho cảnh báo không phải là IMHO có ý nghĩa. Nhưng dù sao, nếu bạn nhìn vào Microsoft documentation, họ thực sự sử dụng phôi trong ví dụ của riêng họ. Tôi không thực sự thấy cần phải tránh một static_cast ở đây, trên thực tế tôi sẽ hoan nghênh nó vì nó làm cho chuyển đổi ngầm rõ ràng hơn và do đó dễ dàng hơn để phát hiện.

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