2012-01-15 36 views
15

Tôi đang đọc một cuốn sách cũ về mã obfuscation trong C (cuốn sách được in năm 1993), và tôi đã nhận thấy rằng các chức năng với các đối số được thực hiện theo cách này:Xác định loại đối số của hàm sau ")", nó có phải là một tiêu chuẩn rất cũ?

real_dump(address, infunc, ofp) 
char *address; 
int (*infunc)(); 
FILE *ofp; 
{ 
    /* the code goes here... */ 
} 

Ngoài ra, không có kiểu trả về là được xác định.

Đây có phải là tiêu chuẩn cũ không? Có thể bật gcc để biên dịch mã này không?

+10

Cú pháp này đã cũ ngay cả năm 1993 :) – dasblinkenlight

+1

Tôi nghĩ rằng trình biên dịch đi kèm với HP-UX chỉ hỗ trợ tính năng này ngay cả trên các hệ thống hiện đại.Trình biên dịch ANSI C tốn thêm tiền. Vì vậy, nếu bạn cần phải biên dịch một chương trình C rất đơn giản, biết cú pháp này thực sự có thể hữu ích. –

+0

Năm 1993, việc sử dụng cú pháp cũ đó là không hợp lý; vẫn có những cỗ máy mà các trình biên dịch gốc không hỗ trợ chuẩn C. Không nhiều, nhưng có một số. Mãi cho đến những năm 90 sau đó (năm 1996 trở đi) các nguyên mẫu là đủ phổ biến để có thể sử dụng tự động. Gần biên giới, nhưng vào năm 1993, vẫn còn chính đáng (mặc dù cần phải có một làm rõ một nơi nào đó trong cuốn sách). –

Trả lời

19

Định nghĩa chức năng ở dạng không phải mẫu thử nghiệm là mã C89, C99 và C11 hợp lệ.

Nó được gọi là định nghĩa hàm kiểu cũ nhưng tính năng này được đánh dấu vì C89 là một tính năng lỗi thời.

Biểu mẫu này phải là không phải được sử dụng trong các chương trình mới.

C99 Lý nói:

"đặc trưng cho phong cách cũ như dùng nưa là có nghĩa là để ngăn cản việc sử dụng nó và để phục vụ như một sự chứng thực mạnh do Ủy ban của phong cách mới."

thậm chí K & R2 không khuyến khích việc sử dụng nó:

"Các phong cách cũ của khai báo và định nghĩa vẫn hoạt động với ANSI C, ít nhất là cho một giai đoạn chuyển tiếp, nhưng chúng tôi khuyên bạn nên sử dụng mới khi bạn có một trình biên dịch hỗ trợ nó. "

Hiện tại, hàm của bạn cũng không có kiểu trả về và bỏ kiểu trả về trong khai báo hàm hoặc định nghĩa hàm không còn giá trị kể từ C99. Trước C99, các hàm không có kiểu trả về hoàn toàn trả về một số int.

Về câu hỏi gcc, theo mặc định gcc biên dịch với -std=gnu89. Nó có nghĩa là C89 Standard + gcc mở rộng. Vì vậy, theo mặc định gcc sẽ chấp nhận để biên dịch một chương trình có khai báo hàm và định nghĩa theo dạng cũ của chúng và không có kiểu trả về.

9

Ouch, đây là cách trước ANSI C để xác định các hàm, tôi thực sự không khuyên bạn sử dụng loại cú pháp này trong mã "bình thường". Tuy nhiên, gcc dường như chấp nhận nó mà không có vấn đề gì (nó vẫn còn trong tiêu chuẩn, mặc dù được đánh dấu là "lỗi thời" trong §6.11.7).

(bằng cách này, như đối với "mất tích" trở lại gõ "ngầm int quy tắc" nên áp dụng)

+2

+1 cho "ouch". Không còn lý do gì để sử dụng K & R C nữa ... –

2

Việc thiếu kiểu trả về có nghĩa là kiểu trả về là int. Đó là mặc định.

4

Đây là kiểu khai báo hàm Kernighan và Ritchie. K & R C đi trước ANSI C, bổ sung thêm các kiểu mẫu chức năng kiểu C++ được sử dụng phổ biến nhất hiện nay.

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