2017-11-02 14 views
5

Tôi không thể tìm thấy cảnh báo cho những điều sau đây trong Visual Studio. Tôi bật/Wall nhưng vẫn nhận được gì:Cảnh báo cho một diễn viên từ một chữ char thành char *

const char * pointer = '\0'; 

gcc sẽ không biên dịch nó cho C++ 11, C++ 14, hoặc C++ 17:

[x86-64 gcc 7.2 #1] error: invalid conversion from 'char' to 'const char*' [-fpermissive]

gcc sẽ biên dịch với trên như một lời cảnh báo nếu tôi vượt qua -fpermissive:

[x86-64 gcc 7.2 #1] warning: invalid conversion from 'char' to 'const char*' [-fpermissive]

kêu vang sẽ không biên dịch cho C++ 11, C++ 14, hoặc C++ 17:

[x86-64 clang 5.0.0 #1] error: cannot initialize a variable of type 'const char *' with an rvalue of type 'char'

Tôi hỏi vì của mã bên dưới cho kết thúc trong codebase của chúng tôi, dường như không có cảnh báo:

std::ofstream file; 
//... 
file.write('\0', 20); 

Có cách nào để bật một cảnh báo cho điều này trong Visual Studio?

Trả lời

1

Visual Studio 2015 chỉ cho phép chuyển đổi này với giá trị const là '\ 0'. Ví dụ:

char c = '\0'; 
const char cconst = '\0'; 

const char * p1 = c;  //error (not even warning) 
const char * p2 = cconst; //ok 
const char * p3 = '\0'; //ok 
const char * p4 = '\1'; //error (not even warning) 

Các lỗi cụ thể là:

Error: a value of type "char" cannot be used to initialize an entity of type "const char *"

của Apple LLVM 8.1.0 (vang-802.0.41) đưa ra một cảnh báo với C++ 03 nhưng một lỗi với C++ 11 và một lát sau. Hành vi này đã được thay đổi vào khoảng giữa ngày 28 tháng 2 năm 2011 (dự thảo N3242 và 15 tháng 5 năm 2013 (dự thảo N3690). Tôi không thể tìm thấy điểm chính xác của mình. code được định nghĩa là một chuyển đổi hợp lệ:

A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of pointer to object or pointer to function type. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification conversion (4.4).

Mục 3.9.1.2 xác định các loại nguyên ký:.

There are five signed integer types: “signed char”, “short int”, “int”, “long int”, and “long long int”.

này được thay đổi trong bản dự thảo sau trong dự thảo N3690 từ năm 2013, phần 4.10 nói:

A null pointer constant is an integer literal (2.14.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type. Such a conversion is called a null pointer conversion. Two null pointer values of the same type shall compare equal. The conversion of a null pointer constant to a pointer to cv-qualified type is a single conversion, and not the sequence of a pointer conversion followed by a qualification conversion (4.4).

character-literal được định nghĩa là chữ trong phần 2.14.1, nhưng nó không xuất hiện trong phần 2.14.2. Thay vào đó nó có phần riêng của nó - 2.14.3.

C++ 17 bản nháp n4659 có cùng một cách chính xác nhưng ở các phần khác nhau.

Tôi không thấy một cách để đưa ra cảnh báo cho điều này trong VS 2015. Đây sẽ là một lý do khác để chạy công cụ phân tích tĩnh/trình biên dịch khác để bắt cảnh báo bổ sung.

Nhờ @EricPostpischil để được trợ giúp.

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