2010-03-22 30 views

Trả lời

39

Tôi hy vọng một ví dụ có thể cung cấp một số giúp đỡ:

// Declaration, saying there is a function f accepting a double. 
void f(double); 

// Declaration, saying there is a function g accepting a double. 
void g(double); 

// ... possibly other code making use of g() ... 

// Implementation using the parameter - this is the "normal" way to use it. In 
// the function the parameter is used and thus must be given a name to be able 
// to reference it. This is still the same function g(double) that was declared 
// above. The name of the variable is not part of the function signature. 
void g(double d) 
{ 
    // This call is possible, thanks to the declaration above, even though 
    // the function definition is further down. 
    f(d); 
} 

// Function having the f(double) signature, which does not make use of 
// its parameter. If the parameter had a name, it would give an 
// "unused variable" compiler warning. 
void f(double) 
{ 
    cout << "Not implemented yet.\n"; 
} 
+0

Đây là câu trả lời hay nhất tại đây. +1. –

+0

Tôi đồng ý, +1 từ tôi –

+0

OK, nó hoạt động tốt. Xin lỗi vì tiếng anh của tôi. – zed91

2

No. Bạn phải đặt tên cho nó. I E.

void f(double myDouble) 
{ 
    printf("%f", myDouble * 2); 
} 

hoặc nếu bạn đang sử dụng iostreams:

void f(double myDouble) 
{ 
    cout << myDouble * 2; 
} 
+0

printf() trong c + +? – Alan

+0

@Alan: 'varargs.h' và cú pháp và hỗ trợ varargs. – dmckee

+2

@Alan: Câu hỏi được áp dụng như nhau cho C hoặc C++, vì vậy tôi đã sử dụng hàm C. –

0

Tham số có thể vẫn được đặt vào stack, vì vậy bạn có thể có thể tìm thấy ở đó (xem các nhận xét dưới đây)

Đối với ví dụ chỉ (cao không cầm tay)

#include<stdio.h> 
void f(double) 
{ 
    double dummy; 
    printf("%lf\n",*(&dummy-2)); //offset of -2 works for *my* compiler 
} 

int main() 
{ 
    f(3.0); 
} 

Tôi không chắc chắn lý do tại sao bạn muốn làm điều này mặc dù

+0

Điều này phụ thuộc nhiều vào việc triển khai thực hiện (phụ thuộc vào CPU, ABI, v.v.). –

+0

@Paul R. Đó là cách giải thích của tôi về câu hỏi. Ít nhất cho đến khi OP làm rõ nó. Tôi đã thêm ghi chú vào câu trả lời của tôi –

+0

đã lưu ý và -1 đã bị xóa. Đề nghị bạn cũng 's/will/may /' và 's/can/có thể có khả năng /', vì có rất nhiều ABI sử dụng thanh ghi cho các tham số truyền. –

-2

trình biên dịch sẽ vượt qua 0 theo mặc định .... của nó cách chúng ta sử dụng để phân biệt toán tử tăng postfix và chúng tôi không bao giờ phải sử dụng giá trị thực tế thông qua ..

+0

Đối số chưa đặt tên không liên quan và không tương quan với giá trị mặc định. Trừ khi người khai báo hàm với đối số chưa được đặt tên cũng cho biết mặc định là 0, trình biên dịch không "chuyển 0 theo mặc định", và người gọi có thể - và phải vượt qua trong một giá trị cụ thể, mặc dù đó không phải là do không có số nhận dạng. Trường hợp cạnh của toán tử 'operator ++' hoặc '-' là một thiếu sót không may trong thiết kế hiện được đặt trong đá, nhưng nó không liên quan đến cách tất cả các arg không tên hoặc mặc định khác hoạt động. –

1

Dưới đây là một tốt link

void bar(int arg1, int /* Now unnamed */, int arg3) 
{ 
    // code for bar, using arg1 and arg3 
} 

Đôi khi, cách tiếp cận trên không chỉ được sử dụng để hỗ trợ mã cũ, mà còn đảm bảo chức năng quá tải được chọn, có thể là một hàm tạo. Nói cách khác, đi qua một đối số bổ sung chỉ để đảm bảo một chức năng nhất định được chọn. Đồng thời, trong quá trình phát triển mã, nó có thể giúp sử dụng một đối số chưa được đặt tên nếu, ví dụ, bạn viết các lệnh cho một số thường trình.

Khi có thể, có thể lập luận rằng các thông số không được sử dụng phải được loại bỏ hoàn toàn khỏi chức năng và từ tất cả các điểm gọi trừ khi bạn cố gắng quá tải toán tử mới hoặc điều gì đó tương tự.

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