cái gì thanh ghi const char * const * name; nghĩa là gì và tại sao biến này nằm ngoài hàm? [bản sao]
void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();
}
Tôi không hiểu tại sao biến đăng ký không nằm trong dấu ngoặc nhọn và đây là gì (void) ở phía trước fprintf? Cũng đăng ký const char * const * cpp, tôi chưa bao giờ thấy bất cứ điều gì như thế này trước đây
Trả lời
Các register
từ khóa là một gợi ý để trình biên dịch mà bạn muốn mà giá trị được lưu giữ trong một thanh ghi chuyên dụng trên các bộ xử lý. Điều này có thể tăng tốc độ đọc và ghi. Tuy nhiên, với các trình biên dịch hiện đại, kiểu tối ưu hóa này không chỉ không cần thiết mà còn phản tác dụng.
Lý do giữa khai báo hàm và khối là trong c (trước C90) cũ, bạn sẽ không khai báo kiểu tham số bên cạnh tham số mà nằm giữa khai báo hàm và khối.
Ví dụ:
int main(argc, argv)
char ** argv;
{
...
}
Lưu ý rằng tôi đã không làm bất cứ điều gì argc
vì nếu bạn không xác định rõ ràng một kiểu, nó sẽ mặc định là int.
Bạn sẽ thấy điều này thường xuyên hơn bạn nghĩ. Tôi đã gặp phải vấn đề này khi tôi làm việc trên FFMPEG.
Điều (void) cast ngăn các cảnh báo / lỗi tham số không sử dụng. Tôi đã gặp phải vấn đề này khi làm việc trên PortAudio với chức năng gọi lại cấp thấp.
Lý do bạn "chưa từng thấy cái này trước đây" là vì cái này đang sử dụng cú pháp của phiên bản K&R C gốc, lịch sử . Đó phải là một số mã C thực, cũ mà bạn đang xem. Tôi vừa tra cứu và ANSI C (C90) ra đời vào năm 1990, vì vậy mã này phải có ít nhất 30 năm, hoặc lâu hơn, cũ.
Tôi cho rằng đây là điều cần biết nếu một người cần xử lý mã C lịch sử, nhưng nếu không, bạn có thể đơn giản quên nó.
Các (void)
diễn viên có nghĩa là điều tương tự nó có nghĩa là ngày hôm nay.