Chúng ta có thể có một hàm lồng nhau trong C không? Việc sử dụng các hàm lồng nhau là gì? Nếu chúng tồn tại trong C thì việc triển khai của chúng có khác gì từ trình biên dịch này sang trình biên dịch khác không?
Chúng ta có thể có một hàm lồng nhau trong C không? Việc sử dụng các hàm lồng nhau là gì? Nếu chúng tồn tại trong C thì việc triển khai của chúng có khác gì từ trình biên dịch này sang trình biên dịch khác không?
Câu trả lời:
Bạn không thể xác định một hàm trong một hàm khác trong tiêu chuẩn C.
Bạn có thể khai báo một hàm bên trong một hàm, nhưng nó không phải là một hàm lồng nhau.
gcc có phần mở rộng ngôn ngữ cho phép các hàm lồng nhau . Chúng không phải là chuẩn, và do đó hoàn toàn phụ thuộc vào trình biên dịch.
Không, chúng không tồn tại trong C.
Chúng được sử dụng trong các ngôn ngữ như Pascal vì (ít nhất) hai lý do:
Chức năng lồng nhau không phải là một phần của ANSI C , tuy nhiên, họ là một phần của Gnu C .
Không, bạn không thể có một hàm lồng trong C
. Cách gần nhất bạn có thể đến là khai báo một hàm bên trong định nghĩa của một hàm khác. Tuy nhiên, định nghĩa của hàm đó phải xuất hiện bên ngoài bất kỳ thân hàm nào khác.
Ví dụ
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
hiển thị sau này trong tệp thì khai báo đó sẽ nằm trong phạm vi của phần còn lại của đơn vị dịch. Ngoài ra, bạn có thể gọi các hàm trong C mà không cần khai báo rõ ràng trong phạm vi ngay cả khi điều đó không được khuyến khích.
Tôi đề cập đến vấn đề này vì nhiều người viết mã bằng C hiện đang sử dụng trình biên dịch C ++ (chẳng hạn như Visual C ++ và Keil uVision) để làm điều đó, vì vậy bạn có thể sử dụng ...
Mặc dù chưa được phép trong C, nếu bạn đang sử dụng C ++, bạn có thể đạt được hiệu quả tương tự với các hàm lambda được giới thiệu trong C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
Như những người khác đã trả lời, tiêu chuẩn C không hỗ trợ các hàm lồng nhau.
Các hàm lồng nhau được sử dụng trong một số ngôn ngữ để đưa nhiều hàm và biến vào một vùng chứa (hàm bên ngoài) để các hàm riêng lẻ (không bao gồm hàm bên ngoài) và các biến không bị nhìn thấy từ bên ngoài.
Trong C , điều này có thể được thực hiện bằng cách đưa các hàm như vậy vào một tệp nguồn riêng biệt. Định nghĩa hàm chính là toàn cục và tất cả các hàm và biến khác là tĩnh . Bây giờ chỉ có chức năng chính được hiển thị bên ngoài mô-đun này.
outer
-> nested
-> outer
-> nested
, thì sẽ có hai khung khác nhau đang giữ int declared_in_outer
, vì vậy bạn không thể chỉ đặt declared_in_outer
dưới dạng toàn cục tĩnh.
Để trả lời câu hỏi thứ hai của bạn, có những ngôn ngữ cho phép xác định các hàm lồng nhau (có thể tìm thấy danh sách tại đây: nested-functions-language-list-wikipedia ).
Trong JavaScript, một trong những ngôn ngữ nổi tiếng nhất trong số những ngôn ngữ đó, một trong số các hàm lồng nhau (được gọi là bao đóng) là:
đến tên một vài...
Hoặc bạn có thể thông minh về nó và sử dụng bộ xử lý trước có lợi cho mình ( source.c
):
#ifndef FIRSTPASS
#include <stdio.h>
//here comes your "nested" definitions
#define FIRSTPASS
#include "source.c"
#undef FIRSTPASS
main(){
#else
int global = 2;
int func() {printf("%d\n", global);}
#endif
#ifndef FIRSTPASS
func();}
#endif
đây không phải là một hàm lồng nhau trong C? (hàm displayAccounts ())
Tôi biết tôi có thể đã định nghĩa hàm theo cách khác và chuyển các biến và những gì không nhưng dù sao cũng hoạt động tốt khi tôi cần in các tài khoản nhiều lần.
(ảnh trích từ bài tập ở trường) ...
//function 'main' that executes the program.
int main(void)
{
int customerArray[3][3] = {{1, 1000, 600}, {2, 5000, 2500}, {3, 10000, 2000}}; //multidimensional customer data array.
int x, y; //counters for the multidimensional customer array.
char inquiry; //variable used to store input from user ('y' or 'n' response on whether or not a recession is present).
//function 'displayAccounts' displays the current status of accounts when called.
void displayAccounts(void)
{
puts("\t\tBank Of Despair\n\nCustomer List:\n--------------");
puts("Account # Credit Limit\t Balance\n--------- ------------\t -------");
for(x = 0; x <= 2; x++)
{
for(y = 0; y <= 2; y++)
printf("%9d\t", customerArray[x][y]);
puts("\n");
}
}
displayAccounts(); //prints accounts to console.
printf("Is there currently a recession (y or n)? ");
//...
return 0;
}