กลับไปหน้าบทความ

อ่าน 4 นาที

ยืนยัน.h

เป็นไฟล์ส่วนหัวในไลบรารีมาตรฐานของภาษา Cโดยจะกำหนดมาโคร พรี โปรเซสเซอร์ของภาษา C และใช้ในการตรวจสอบ เงื่อนไขขณะรันไทม์ ในภาษา C assert

ยืนยัน.h

<assert.h>เป็นไฟล์ส่วนหัวในไลบรารีมาตรฐานของภาษา Cโดยจะกำหนดมาโคร พรี โปรเซสเซอร์ของภาษา C และใช้ในการตรวจสอบ เงื่อนไขขณะรันไทม์ ในภาษา C assert

<assert.h>ถูกกำหนดไว้ในANSI Cเป็นส่วนหนึ่งของไลบรารีมาตรฐาน C ในภาษาการเขียนโปรแกรมC++<assert.h>และ<cassert>สามารถใช้งานได้ ทั้งสองแบบมีฟังก์ชันการทำงานที่เทียบเท่ากัน[ 1 ]

ใช้

มาโคร นี้assertใช้การตรวจสอบขณะรันไทม์ หากนิพจน์ภายในเป็นเท็จ มาโครจะพิมพ์ข้อความไปยังstderrและเรียกใช้ฟังก์ชันabort()ที่กำหนดไว้ใน<stdlib.h>ข้อความจะรวมชื่อไฟล์ต้นฉบับและหมายเลขบรรทัดต้นฉบับจากมาโครและตามลำดับ[ 2 ]ตั้งแต่C99 เป็นต้นมา ชื่อของฟังก์ชันที่คำสั่ง assert จะถูกรวมไว้เป็น ( ) และนิพจน์เอง[ 3 ]ใน ANSI C นิพจน์ในมาโครถูกกำหนดให้เป็นจำนวนเต็มที่มีเครื่องหมายแม้ว่านิพจน์ใดๆ ที่สามารถแปลงเป็นจำนวนเต็มที่มีเครื่องหมายได้โดยปริยายก็สามารถใช้ได้ ใน C99 มาโครอนุญาตให้ ใช้ ประเภทสเกลาร์ ใดๆ ก็ได้ [ 4 ]การใช้งานทั่วไปสองอย่างของมาโครคือการตรวจสอบว่าตัวชี้ไม่ใช่ค่าว่างและเพื่อให้แน่ใจว่าดัชนีอาร์เรย์อยู่ในขอบเขต[ 5 ]__FILE____LINE____FUNC__assertassertassert

ด้านล่างนี้คือโปรแกรมที่ใช้assertมาโคร โปรแกรมนี้จะประเมินค่าpointerเป็นเท็จเสมอ เนื่องจากpointerเป็นตัวชี้ว่างและไม่ได้ชี้ไปยังตำแหน่งหน่วยความจำ ที่ถูกต้อง :

#include <assert.h> #include <stddef.h>int main () { void * ptr = NULL ; assert ( ptr ); return 0 ; }

หลังจากคอมไพล์และรันโปรแกรมแล้ว จะแสดงข้อความที่คล้ายกับข้อความต่อไปนี้:

โปรแกรม: source.c:5: main: การตรวจสอบ 'ptr' ล้มเหลว โปรแกรมหยุดทำงาน (core dumped)

นิยามของassertมาโครจะเปลี่ยนแปลงไปตามนิยามของมาโครอื่นNDEBUGถ้าNDEBUGถูกกำหนดให้เป็นชื่อมาโครassertมาโครจะถูกกำหนดเป็น#define assert(ignore) ((void)0)[ 3 ] ส่งผลให้มาโครไม่ประเมินนิพจน์ การใช้ อาจส่งผลต่อพฤติกรรมโดยรวมของโปรแกรมหาก มีคำสั่งNDEBUGอย่างน้อยหนึ่ง คำสั่งที่ มีผลข้างเคียงเนื่องจากคำสั่งเหล่านี้จะไม่ถูกประเมิน[ 6 ]assert

มาโคร นี้assertไม่ได้รวมข้อความแสดงข้อผิดพลาดไว้ด้วย อย่างไรก็ตามสามารถใช้ตัวดำเนินการคอมมา เพื่อเพิ่มข้อความแสดงข้อผิดพลาดลงในนิพจน์ที่พิมพ์ได้ เช่น[ 7 ]assert(("Not Orwellian",2+2==5));

static_assert

คีย์เวิร์ดstatic_assertที่เพิ่มเข้ามาในC++11มีจุดประสงค์คล้ายกับassertมาโคร แต่ต่างจากassertมาโครตรงstatic_assertที่ทำงานในระหว่างการคอมไพล์แทนที่จะเป็นในระหว่างการรันไทม์[ 8 ]การใช้งานดั้งเดิมใช้เทคนิคเทมเพลต คีย์เวิร์ดนี้static_assertรับนิพจน์คงที่ที่สามารถแปลงเป็นบูลีนและสตริงลิเทอรัลได้ หากนิพจน์ล้มเหลว สตริงลิเทอรัลจะถูกส่งคืน มิฉะนั้น การยืนยันจะไม่มีผล[ 8 ]ในC++17ข้อความแสดงความล้มเหลวของการยืนยันนี้ถูกทำให้เป็นตัวเลือก และข้อความถัดไปจะถูกละเว้นหากไม่ได้ระบุ[ 9 ]

ในC11การประกาศที่เทียบเท่ากันในเชิงฟังก์ชัน_Static_assertถูกเพิ่มเข้ามา<assert.h>กำหนดstatic_assertให้เป็นนามแฝงสำหรับ เพื่อ_Static_assertให้มั่นใจว่ามีความเท่าเทียมกันกับC++ [ 10 ] ใน C23 ถูกเปลี่ยน_Static_assertชื่อเป็นstatic_assertและอาร์กิวเมนต์สตริงลิเทอรัลถูกทำให้เป็นตัวเลือก[ 11 ] [ 12 ] Gnulibกำหนดstatic_assertสำหรับแพลตฟอร์มที่ไม่ใช้ C11 และไม่จำเป็น<assert.h>ต้องรวมไว้[ 13 ]

สัญญายืนยัน

คำcontract_assertหลักที่เพิ่มเข้ามาในC++26ใช้สำหรับ การยืนยัน สัญญาและใช้เพื่อตรวจสอบเงื่อนไขภายในคล้ายกับassert()มาโครโดยการรับรองว่าเงื่อนไขนั้นเป็นจริงในระหว่างการดำเนินการ[ 14 ] [ 15 ]

int f ( vector < int >& v ) pre ( v . size () >= 1 && v [ 0 ] > 0 ) post ( r : r == v [ 0 ] && r != 1 ) { // ... contract_assert ( v [ 0 ] != 1 ); // ... return v [ 0 ]; }

ภาษาอื่นๆ

ในภาษาJavaassertเป็นคำสำคัญ

ในภาษา C#ไม่มีมาโครหรือคีย์เวิร์ดสำหรับการตรวจสอบเงื่อนไข แต่จะมีคลาสSystem.Diagnostics.DebugและSystem.Diagnostics.Traceเมธอดต่างๆAssert()แทน

ในภาษา Rustมีassert!()มาโคร อยู่

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Assert.h&oldid=1359589742 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ยืนยัน.h

เป็นไฟล์ส่วนหัวในไลบรารีมาตรฐานของภาษา Cโดยจะกำหนดมาโคร พรี โปรเซสเซอร์ของภาษา C และใช้ในการตรวจสอบ เงื่อนไขขณะรันไทม์ ในภาษา C assert

ใช้

มาโคร นี้ assert ใช้การตรวจสอบขณะรันไทม์ หากนิพจน์ภายในเป็นเท็จ มาโครจะพิมพ์ข้อความไปยัง stderr และเรียกใช้ฟังก์ชัน abort() ที่กำหนดไว้ใน ข้อความจะรวมชื่อไฟล์ต้นฉบับและหมายเลขบรรทัดต้นฉบับจากมาโครและตามลำดับ [ 2 ] ตั้งแต่ C99 เป็นต้นมา...

static_assert

คีย์เวิร์ด static_assert ที่เพิ่มเข้ามาใน C++11 มีจุดประสงค์คล้ายกับ assert มาโคร แต่ต่างจาก assert มาโครตรง static_assert ที่ทำงานในระหว่าง การคอมไพล์ แทนที่จะเป็นในระหว่างการรันไทม์ [ 8 ] การใช้งานดั้งเดิมใช้เทคนิคเทมเพลต คีย์เวิร์ดนี้ static_assert...

สัญญายืนยัน

คำ contract_assert หลักที่เพิ่มเข้ามาใน C++26 ใช้สำหรับ การยืนยัน สัญญา และใช้เพื่อตรวจสอบเงื่อนไขภายในคล้ายกับ assert() มาโครโดยการรับรองว่าเงื่อนไขนั้นเป็นจริงในระหว่างการดำเนินการ [ 14 ] [ 15 ]