เราสามารถมีฟังก์ชันซ้อนใน C ได้หรือไม่? การใช้ฟังก์ชันซ้อนกันคืออะไร? หากมีอยู่ใน C การนำไปใช้งานแตกต่างจากคอมไพเลอร์ถึงคอมไพเลอร์หรือไม่?
เราสามารถมีฟังก์ชันซ้อนใน C ได้หรือไม่? การใช้ฟังก์ชันซ้อนกันคืออะไร? หากมีอยู่ใน C การนำไปใช้งานแตกต่างจากคอมไพเลอร์ถึงคอมไพเลอร์หรือไม่?
คำตอบ:
ไม่ไม่มีอยู่ใน C
มีการใช้ในภาษาเช่น Pascal ด้วยเหตุผล (อย่างน้อย) สองประการ:
ฟังก์ชั่นที่ซ้อนกันไม่ได้เป็นส่วนหนึ่งของANSI Cแต่พวกเขาเป็นส่วนหนึ่งของ Gnu C
ไม่คุณไม่สามารถมีฟังก์ชันซ้อนกันC
ได้ สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถมาได้คือการประกาศฟังก์ชันภายในนิยามของฟังก์ชันอื่น คำจำกัดความของฟังก์ชันนั้นจะต้องปรากฏอยู่นอกส่วนของฟังก์ชันอื่น ๆ
เช่น
void f(void)
{
// Declare a function called g
void g(void);
// Call g
g();
}
// Definition of g
void g(void)
{
}
g
สามารถมองเห็นได้ในภายหลังในไฟล์ที่การประกาศอยู่ในขอบเขตสำหรับหน่วยการแปลที่เหลือ นอกจากนี้คุณสามารถเรียกใช้ฟังก์ชันใน C โดยไม่ต้องมีการประกาศที่มองเห็นได้ในขอบเขตแม้ว่าจะไม่แนะนำก็ตาม
ฉันพูดถึงสิ่งนี้เนื่องจากหลายคนที่เขียนโค้ดใน C ตอนนี้ใช้คอมไพเลอร์ C ++ (เช่น Visual C ++ และ Keil uVision) เพื่อทำสิ่งนี้ดังนั้นคุณอาจสามารถใช้ประโยชน์จากสิ่งนี้ได้ ...
แม้ว่าจะยังไม่ได้รับอนุญาตใน C แต่หากคุณใช้ C ++ คุณสามารถบรรลุผลเช่นเดียวกันกับฟังก์ชันแลมบ์ดาที่แนะนำใน C ++ 11:
void f()
{
auto g = [] () { /* Some functionality */ }
g();
}
ตามที่คนอื่นตอบมาตรฐาน C ไม่สนับสนุนฟังก์ชันซ้อนกัน
ฟังก์ชันที่ซ้อนกันใช้ในบางภาษาเพื่อรวมฟังก์ชันและตัวแปรหลายตัวไว้ในคอนเทนเนอร์ (ฟังก์ชันด้านนอก) เพื่อให้แต่ละฟังก์ชัน (ไม่รวมฟังก์ชันด้านนอก) และตัวแปรไม่สามารถมองเห็นได้จากภายนอก
ในCสามารถทำได้โดยใส่ฟังก์ชันดังกล่าวในไฟล์ต้นฉบับแยกต่างหาก กำหนดฟังก์ชั่นหลัก ๆ ทั่วโลกและทุกฟังก์ชั่นอื่น ๆ และตัวแปรเป็นแบบคงที่ ตอนนี้มีเพียงฟังก์ชันหลักเท่านั้นที่มองเห็นได้ภายนอกโมดูลนี้
outer
-> nested
-> outer
-> nested
จะมีสองเฟรมที่แตกต่างกันint declared_in_outer
คุณจึงไม่สามารถใส่declared_in_outer
เป็นโกลบอลแบบคงที่ได้
เพื่อตอบคำถามที่สองของคุณมีภาษาที่อนุญาตให้กำหนดฟังก์ชันซ้อนกันได้ (สามารถดูรายการได้ที่นี่: ฟังก์ชันที่ซ้อนกัน - ภาษารายการ - วิกิพีเดีย )
ใน JavaScript ซึ่งเป็นหนึ่งในภาษาที่มีชื่อเสียงที่สุดหนึ่งในฟังก์ชันซ้อนกัน (ซึ่งเรียกว่าการปิด) ได้แก่ :
เพื่อชื่อไม่กี่ ...
หรือคุณสามารถฉลาดเกี่ยวกับเรื่องนี้และใช้ตัวประมวลผลล่วงหน้าเพื่อประโยชน์ของคุณ ( 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
นี่ไม่ใช่ฟังก์ชันซ้อนใน C ใช่หรือไม่ (ฟังก์ชัน displayAccounts ())
ฉันรู้ว่าฉันสามารถกำหนดฟังก์ชั่นที่แตกต่างกันและส่งผ่านตัวแปรได้และสิ่งที่ไม่ได้ผลดีเพราะฉันต้องพิมพ์บัญชีหลาย ๆ ครั้ง
(snipet เอามาจากงานโรงเรียน) ...
//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;
}