Đoạn mã sau (chính xác) đưa ra một cảnh báo trong C và một lỗi trong C++ (sử dụng gcc & g ++ tương ứng, thử nghiệm với phiên bản 3.4.5 và 4.2.1; MSVC dường như không quan tâm):Tại sao tôi không thể chuyển đổi 'char **' thành 'const char * const *' trong C?
char **a;
const char** b = a;
Tôi có thể hiểu và chấp nhận điều này.
Giải pháp C++ cho vấn đề này là thay đổi b thành const char * const *, không cho phép gán lại các con trỏ và ngăn bạn phá vỡ tính chính xác của const (C++ FAQ).
char **a;
const char* const* b = a;
Tuy nhiên, trong C tinh khiết, phiên bản chỉnh sửa (sử dụng const char * const *) vẫn đưa ra một cảnh báo, và tôi không hiểu tại sao. Có cách nào để giải quyết vấn đề này mà không sử dụng dàn diễn viên không?
Để làm rõ:
1) Tại sao điều này tạo ra cảnh báo trong C? Nó phải hoàn toàn an toàn, và trình biên dịch C++ dường như nhận ra nó như vậy.
2) Cách chính xác để đi về việc chấp nhận char này ** như một tham số trong khi nói (và có trình biên dịch bắt buộc) rằng tôi sẽ không sửa đổi các ký tự nó trỏ đến? Ví dụ, nếu tôi muốn viết một hàm:
void f(const char* const* in) {
// Only reads the data from in, does not write to it
}
Và tôi muốn gọi nó trên một char **, những gì sẽ là đúng loại cho các tham số?
Chỉnh sửa: Cảm ơn những người đã trả lời, đặc biệt là những người đã giải quyết câu hỏi và/hoặc theo dõi câu trả lời của tôi.
Tôi đã chấp nhận câu trả lời rằng những gì tôi muốn làm không thể được thực hiện mà không có diễn viên, bất kể có nên hay không.
Tôi nhầm lẫn với câu hỏi của bạn, có phải là: "Làm cách nào để C không cảnh báo tôi?" hoặc là nó "Làm thế nào để có được C + + không ném một lỗi biên dịch?" Hoặc có lẽ nó không phải là những thứ này. – user7116
Tôi đồng ý với sáu bản sao, câu hỏi này cần làm rõ thêm. –
Câu hỏi đặt ra là "tại sao tôi không thể chuyển đổi 'char **' thành 'char * const *?" – Kevin