วิธีแก้ไขคำเตือน function declaration isn't a prototype
ใน C
เมื่อคุณเขียนโปรแกรม C คุณอาจพบคำเตือนที่ระบุว่า "function declaration isn't a prototype"
คำเตือนนี้อาจสร้างความสับสนโดยเฉพาะอย่างยิ่งหากคุณพยายามเรียกใช้ฟังก์ชันจากไลบรารีของคุณเอง ในโพสต์บล็อกนี้เราจะสำรวจว่าคำเตือนนี้หมายถึงอะไร ทำไมจึงเกิดขึ้น และวิธีการประกาศโปรโตไทป์ฟังก์ชันอย่างถูกต้องเพื่อแก้ปัญหา
ทำความเข้าใจกับคำเตือน
คำเตือนนี้เกิดขึ้นเมื่อคอมไพเลอร์ตรวจพบการประกาศฟังก์ชันที่ไม่เป็นไปตามกฎที่เข้มงวดของโปรโตไทป์ฟังก์ชันใน C สิ่งนี้อาจเกิดขึ้นได้จากหลายสาเหตุ อย่างไรก็ตาม รากของปัญหามักจะอยู่ที่วิธีที่คุณประกาศฟังก์ชันในไฟล์หัวของคุณ
ตัวอย่างโค้ด
เพื่อให้เห็นคำเตือนนี้ได้ชัดเจนยิ่งขึ้น เรามาดูตัวอย่างโดยใช้ไฟล์สามไฟล์:
-
mylib.c – การนำฟังก์ชันไปใช้งาน
#include <mylib.h> int testlib() { printf("Hello, World!\n"); return (0); }
-
mylib.h – ไฟล์หัวที่ประกาศฟังก์ชัน
#include <stdio.h> extern int testlib();
-
myprogram.c – โปรแกรมหลักที่เรียกใช้ฟังก์ชัน
#include <mylib.h> int main(int argc, char *argv[]) { testlib(); return (0); }
ข้อผิดพลาดในการคอมไพล์
เมื่อคอมไพล์ myprogram.c
คุณอาจพบข้อผิดพลาดเช่นนี้:
ในไฟล์ที่รวมจาก myprogram.c:1
mylib.h:2 คำเตือน: function declaration isn't a prototype
คำเตือนนี้บ่งชี้ว่าการประกาศฟังก์ชันใน mylib.h
ไม่ถูกต้องหรือไม่สมบูรณ์ตามมาตรฐานภาษา C
วิธีแก้ไขปัญหา
โปรโตไทป์ฟังก์ชัน
สิ่งสำคัญคือต้องเข้าใจว่าฟังก์ชันโปรโตไทป์ใน C ระบุประเภทของค่าที่ฟังก์ชันส่งกลับและพารามิเตอร์ของมัน ตัวอย่างเช่น:
int testlib();
(หมายความว่าtestlib
สามารถรับค่าอาร์กิวเมนต์จำนวนใดก็ได้)int testlib(void);
(หมายความว่าtestlib
ไม่รับค่าอาร์กิวเมนต์)
ใช้ void
สำหรับไม่มีอาร์กิวเมนต์
เพื่อหลีกเลี่ยงความสับสนและให้แน่ใจว่าฟังก์ชันของคุณถูกตีความอย่างถูกต้องโดยคอมไพเลอร์ ควรใช้ void
ในรายการพารามิเตอร์สำหรับฟังก์ชันที่ไม่รับค่าอาร์กิวเมนต์ แก้ไข mylib.h
ของคุณดังนี้:
#include <stdio.h>
int testlib(void); // การประกาศที่ถูกต้อง
ลบ extern
ที่ไม่จำเป็น
อีกจุดที่สำคัญคือคีย์เวิร์ด extern
จริง ๆ แล้วไม่จำเป็นสำหรับการประกาศฟังก์ชัน เนื่องจากชื่อฟังก์ชันทั้งหมดจะถูกระบุในช่วงเวลาของการเชื่อมโยงตามค่าเริ่มต้น คุณสามารถเขียนเพียงแค่:
#include <stdio.h>
int testlib(void); // วิธีที่แนะนำในการประกาศ
โดยการปฏิบัติตามแนวทางเหล่านี้ คอมไพเลอร์จะตีความฟังก์ชันว่าเป็นโปรโตไทป์ที่ไม่รับพารามิเตอร์ ซึ่งจะกำจัดคำเตือนนี้ออกไป
สรุป
การแก้ไขคำเตือน "function declaration isn't a prototype"
เป็นเรื่องง่าย จำไว้ว่าให้ใช้ void
ในรายการพารามิเตอร์เมื่อฟังก์ชันไม่รับค่าอาร์กิวเมนต์ และสังเกตว่าการใช้ extern
โดยเฉพาะมักจะไม่จำเป็น เมื่อปฏิบัติตามแนวทางเหล่านี้ คุณจะสามารถหลีกเลี่ยงความสับสนและให้แน่ใจว่าโปรแกรม C ของคุณคอมไพล์ได้อย่างราบรื่น
หากคุณนำแนวทางปฏิบัติที่ดีที่สุดเหล่านี้ไปใช้ในนิสัยการเขียนโค้ดของคุณ คุณจะพบว่าคุณสามารถเขียนโค้ด C ที่สะอาดและชัดเจนมากขึ้นโดยไม่ต้องเผชิญกับการประกาศฟังก์ชันที่ไม่ชัดเจน ขอให้คุณเขียนโค้ดอย่างมีความสุข!