Tôi đã xem xét một ví dụ cho thấy rằng tại sao typedef'ng một con trỏ là một thực tế xấu. Phần tôi không hiểu về ví dụ này là tại sao trình biên dịch không thể bắt được vấn đề. Tôi đã xây dựng ví dụ này thành mã sau:typedef'ng một con trỏ và const
#include <stdio.h>
typedef int *TYPE;
void set_type(TYPE t) {
*t = 12;
}
void foo(const TYPE mytype) {
set_type(mytype); // Error expected, but in fact compiles
}
int main() {
TYPE a;
int b = 10;
a = &b;
printf("A is %d\n",*a);
foo(a);
printf("A is %d\n",*a);
return 0;
}
Vì vậy, tôi có thể thay đổi giá trị a
. Mặc dù, ví dụ giải thích rằng bạn sẽ phải làm, typedef const int *TYPE
, để giải quyết vấn đề, tôi không hiểu lý do tại sao trình biên dịch không thể nắm bắt được lỗi khi tôi đang đặt TYPE to be const
trong chính đối số hàm. Tôi chắc chắn rằng tôi đang thiếu một cái gì đó rất cơ bản.
Trả lời, KHÔNG. 'typedef'ing một con trỏ sẽ gây ra nhiều vấn đề hơn lợi ích của" * đường cú pháp * ". –
Tôi chắc chắn bạn đúng, nhưng tôi xin lỗi, đó không phải là câu trả lời tôi đang tìm kiếm. –
Vấn đề của bạn thực sự bắt nguồn từ ẩn ngữ nghĩa của con trỏ. Như @iharob đã viết: không 'typedef' con trỏ. Điều đó chỉ dẫn đến sự nhầm lẫn và lỗi tinh tế.6 Lưu ý rằng bạn không thể thay đổi giá trị của 'a' trong các hàm, nhưng chỉ có' * a', tức là 'b'. 'a' khá vô ích, bạn có thể vừa chuyển' & b' sang 'foo' và in' b' trực tiếp. – Olaf