Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ฟังก์ชันซ้อน (Nested Functions) ในภาษา C

ในบางแอปพลิเคชันอาจเห็นว่ามีฟังก์ชันประกาศอยู่ภายในอีกฟังก์ชันหนึ่ง เรื่องนี้บางครั้งเรียกว่า Nested Function แต่จริงๆ แล้วใน C มันไม่ใช่ Nested Function จริงๆ เรียกว่า Lexical Scoping ซึ่ง C ไม่รองรับเพราะคอมไพเลอร์ไม่สามารถเข้าถึงตำแหน่งหน่วยความจำที่ถูกต้องของฟังก์ชันภายในได้

ฟังก์ชันซ้อนไม่สามารถเข้าถึงตัวแปรท้องถิ่นของบล็อกรอบข้างได้ สามารถเข้าถึงได้เฉพาะตัวแปรกล로บอล ใน C มี 2 ขอบเขต (scope) คือ local และ global ดังนั้นฟังก์ชันซ้อนจึงมีการใช้งานจำกัด หากพยายามสร้างฟังก์ชันซ้อนแบบนี้จะเกิดข้อผิดพลาด

ตัวอย่างที่ทำงานไม่ได้

#include <stdio.h>

int main(void) {
    printf("Main Function");
    int my_fun() {
        printf("my_fun function");
        int my_fun2() {
            printf("my_fun2 is inner function");
        }
    }
    my_fun2(); // Error: undefined reference to 'my_fun2'
}

ข้อผิดพลาด

text.c:(.text+0x1a): undefined reference to `my_fun2'

อย่างไรก็ตาม GNU C Compiler มีส่วนขยาย (extension) อนุญาตให้ประกาศฟังก์ชันซ้อนได้ โดยใช้คีย์เวิร์ด auto ก่อนการประกาศ

ตัวอย่างที่ทำงานได้ (GNU C Extension)

#include <stdio.h>

int main(void) {
    auto int my_fun();
    my_fun();
    printf("Main Function\n");
    return 0;
}

int my_fun() {
    printf("my_fun function\n");
    return 0;
}

ผลลัพธ์

my_fun function
Main Function