2016-01-18 39 views
8

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.

+2

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 * ". –

+0

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. –

+1

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

Trả lời

13

Vấn đề ở đây là sự nhầm lẫn về những gì const đang được áp dụng cho: liệu nó có được áp dụng cho chính giá trị con trỏ hay giá trị được trỏ tới không?

const TYPE x cho biết giá trị con trỏ phải không đổi. Giá trị này tương đương với int * const x. Lưu ý rằng đoạn mã sau không kết quả trong một lỗi:

int b = 10; 
const TYPE p = NULL; 
p = &b; // error here (assign to const) 

gì bạn đang mong đợi là const int * x, mà làm cho giá trị trỏ đến bởi x một hằng số.

Kể từ khi typedef giấu sự thật rằng TYPE là một loại con trỏ, không có cách nào để xác định rằng điều được trỏ đến bởi TYPE nên const, ngoài việc tuyên bố một typedef:

typedef const int * CONST_TYPE; 

Tuy nhiên, lúc này điểm typedef dường như gây ra nhiều rắc rối hơn là nó giải quyết ... Có lẽ không phải là ý tưởng tốt nhất.

+0

Tôi đã hiểu rõ điểm bạn đã làm và giờ nó đã xóa đi sự nhầm lẫn. tuy nhiên, khai báo cuối cùng bạn thêm vào là sai đối với câu hỏi này vì tôi đang tìm kiếm một giá trị không đổi, không phải là một con trỏ liên tục. Bạn có thể vui lòng chỉnh sửa để tôi có thể chấp nhận câu trả lời không. –

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