2012-01-22 51 views
7

Chuẩn C cho biết, đối với định nghĩa hàm nếu người khai báo bao gồm danh sách định danh, các kiểu tham số sẽ được khai báo trong danh sách khai báo sau. Rõ ràng điều này tạo nên sự khác biệt.Khai báo các tham số bên ngoài người khai báo

extern int max(int a, int b) 
{ 
return a > b ? a : b; 
} 

extern int max(a, b) 
int a, b; 
{ 
return a > b ? a : b; 
} 

Ở đây int a, b; là danh sách khai báo cho các tham số. Sự khác biệt giữa hai định nghĩa này là biểu mẫu đầu tiên hoạt động làm tuyên bố mẫu thử buộc chuyển đổi các đối số của các cuộc gọi tiếp theo sang hàm, trong khi biểu mẫu thứ hai thì không.

Điều này có ý nghĩa gì đối với các lập trình viên và nó ảnh hưởng đến các mã trình biên dịch tạo ra?

Trả lời

11

Điều đó có nghĩa là trong trường hợp thứ hai, đó là trách nhiệm của người gọi để đảm bảo rằng các đối số được cung cấp là đúng loại; không có chuyển đổi tiềm ẩn nào được cung cấp (trừ các khuyến mãi đối số mặc định). Từ phần 6.5.2.2:

Nếu biểu thức biểu thị hàm được gọi có loại không bao gồm nguyên mẫu , thì số lượng thăng hạng được thực hiện trên mỗi đối số.

...

Nếu biểu thức biểu thị được gọi là chức năng có một kiểu mà không bao gồm một nguyên mẫu, các đối số được ngầm chuyển đổi, như thể bằng cách chuyển nhượng, để các loại của thông số tương ứng.

Vì vậy, mã gọi như thế này sẽ là ok:

char x = 3; 
char y = 7; 
max(x, y); // Equivalent to max((int)x, (int)y) 

xy được thăng int trước khi được đặt trên stack.

Tuy nhiên, mã như thế này sẽ không được ok:

double x = 3.0; 
long y = 7; 
max(x, y); // Uh-oh 

xy sẽ được đặt trên stack như doublelong, nhưng max() sẽ cố gắng đọc hai int s, mà sẽ dẫn đến không xác định hành vi (trong thực tế, các bit thô sẽ được giải thích lại).

Đây là một lý do không sử dụng biểu mẫu thứ hai; lý do duy nhất trong tiêu chuẩn là cung cấp khả năng tương thích ngược với mã di sản (cực kỳ). Nếu bạn đang sử dụng GCC, bạn có thể thực thi điều này bằng cách sử dụng cờ -Wold-style-definition; Tôi hy vọng rằng các trình biên dịch khác sẽ cung cấp một cái gì đó tương đương.

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