Tôi cần thực hiện sửa đổi một chức năng hiện có, với một số const
Thông số đầu vào:
int f(const owntype *r1, const owntype *r2)
Để làm điều này tôi muốn gọi một hàm sử dụng cùng loại nhưng không có const
Chức năng phụ của từ khóa:
hàm con void (owntype *src, owntype *dst)
Tôi đã thử cách này (và một số biến thể khác) nhưng không được:
int f(const owntype *r1, const owntype *r2) {
...
hàm con((const owntyp*) r1);
...
}
Làm cách nào tôi có thể biên dịch nó mà không thay đổi mô tả tham số của cả hai hàm?
Giải pháp tốt nhất là sửa đổi subfunction
để có được con trỏ tới const
con trỏ.
Trong thực tế, đôi khi điều này là không thể (ví dụ: mã cần được sửa đổi mà không được phép sửa đổi do quy ước của tổ chức). Trong những trường hợp này bạn có thể viết:
hàm con( (owntype *)r1, (owntype *)r2 );
miễn là bạn chắc chắn subfunction
Đối tượng nhọn không được sửa đổi, điều này đúng. Nếu nó cố gắng sửa đổi chúng, nó sẽ gây ra hành vi không xác định khi cố gắng sửa đổi chúng.
Nếu bạn không chắc chắn subfunction
và bạn muốn lập trình phòng thủ, thì một lựa chọn khác là lấy một bản sao của đối tượng:
owntype c1 = *r1, c2 = *r2;
hàm con( &c1, &c2 );
Lưu ý rằng việc kiểm tra bản sao không bị hỏng riêng loại
lớp bất biến.
Một số câu trả lời/nhận xét khác cho thấy việc thả const có thể là hành vi không xác định. Nhưng đây không phải là trường hợp. Tài liệu tham khảo có liên quan là C11 6.7.3/6:
Nếu một nỗ lực được thực hiện để sửa đổi một đối tượng được xác định bằng loại đủ điều kiện const thông qua việc sử dụng lvalue với loại không đủ tiêu chuẩn const, hành vi không được xác định.
Liên kết đến câu hỏi về chủ đề đó
Tôi là một lập trình viên xuất sắc, rất giỏi!