2013-03-13 34 views
10

chức năng chính của tôi là như sau:Đi qua Đối số 1 vứt bỏ vòng loại từ con trỏ loại mục tiêu

int main(int argc, char const *argv[]) 
{ 
    huffenc(argv[1]); 
    return 0; 
} 

Trình biên dịch sẽ trả về cảnh báo:

huffenc.c:76: warning: passing argument 1 of ‘huffenc’ discards qualifiers from pointer target type

Để tham khảo, huffenc mất một đầu vào char*, và chức năng được thực thi, với đầu vào mẫu "vô nghĩa" qua ./huffenc senselessness

Cảnh báo này có ý nghĩa gì?

+5

Bạn nói rằng 'huffenc' lấy một' char * ', nhưng bạn đang chuyển nó một' char const * '... –

+0

Thật sao? Điều này có nghĩa là tôi phải sử dụng loại cưỡng chế trên nó? –

+0

Tôi nghĩ bạn có thể tham khảo câu hỏi này cũng http://stackoverflow.com/questions/2316387/initialization-discards-qualifiers-from-pointer-target-type – Ganesh

Trả lời

15

Điều đó có nghĩa là bạn đang chuyển đối số const đến hàm không tham số không phải là const, có khả năng không hợp lệ vì lý do hiển nhiên.

huffenc có thể không cần tham số không phải là const, vì vậy, nó phải mất const char*. Tuy nhiên, định nghĩa của bạn về main là không chuẩn.

Các C99 Mục tiêu chuẩn 5.1.2.2.1 (Chương trình khởi động) khẳng định:

Chức năng gọi lúc khởi động chương trình được đặt tên chính. Việc triển khai tuyên bố không có nguyên mẫu cho chức năng này. Nó sẽ de fi định nghĩa với một kiểu trả về của int và không có thông số:

int main(void) { /* ... */ } 

hoặc với hai tham số (gọi tắt ở đây là argc và argv, mặc dù bất kỳ tên chưa sử dụng, vì chúng là địa phương để các chức năng, trong đó họ được khai báo):

int main(int argc, char *argv[]) { /* ... */ } 

hoặc tương đương; 9) hoặc trong một số khác thực hiện-d e fi ned cách.

Và tiếp tục nói ...

... Các thông số argc và argv và chuỗi trỏ đến bởi các mảng argv sẽ được Modi fi có thể do chương trình, và giữ họ các giá trị được lưu trữ lần cuối giữa chương trình kết thúc chương trình và khởi động.

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