ตัวเลือกของบรรณาธิการ:

การโฆษณา

บ้าน - แอนติไวรัส
สิ่งที่ควรอยู่ใน c-file และสิ่งที่ควรอยู่ใน h-file? ออนไลน์รวมไฟล์ต้นฉบับ C หนึ่งไฟล์ไว้ในไฟล์อื่นด้วยหรือไม่ การแบ่งข้อความโปรแกรมออกเป็นโมดูล


ใช้อย่างถูกต้องนี่อาจเป็นวิธีที่มีประโยชน์

สมมติว่าคุณมีระบบย่อยที่มีความสำคัญต่อภารกิจที่ซับซ้อนซึ่งมีอินเทอร์เฟซสาธารณะที่ค่อนข้างเล็กและมีโค้ดการใช้งานจำนวนมากที่ยังไม่ได้ใช้งาน โค้ดมีความยาวหลายพันบรรทัด มีฟังก์ชันส่วนตัวนับร้อยและมีข้อมูลส่วนตัวไม่น้อย หากคุณทำงานกับระบบฝังตัวที่ไม่สำคัญ คุณอาจพบสถานการณ์นี้ค่อนข้างบ่อย

โซลูชันของคุณมีแนวโน้มที่จะแบ่งชั้น เป็นโมดูล และแยกส่วน และประเด็นเหล่านี้สามารถนำเสนอและปรับปรุงได้อย่างสะดวกโดยการเขียนโค้ดส่วนต่างๆ ของระบบย่อยในไฟล์ต่างๆ

ด้วย C คุณจะสูญเสียอะไรมากมายจากการทำเช่นนี้ เครื่องมือเกือบทั้งหมดมีการปรับปรุงที่เหมาะสมสำหรับหน่วยการคอมไพล์เดียว แต่กลับมองโลกในแง่ร้ายมากเกี่ยวกับสิ่งใดก็ตามที่ประกาศจากภายนอก

หากคุณรวมทุกอย่างไว้ในโมดูลซอร์ส C เดียวคุณจะได้รับ -

    การปรับปรุงประสิทธิภาพและขนาดโค้ด - การเรียกใช้ฟังก์ชันจะอยู่ในบรรทัดในหลายกรณี แม้ว่าจะไม่มีอินเลย์ แต่คอมไพลเลอร์ก็สามารถสร้างโค้ดที่มีประสิทธิภาพมากขึ้นได้

    ข้อมูลระดับช่องและฟังก์ชั่นถูกซ่อนอยู่

    หลีกเลี่ยงมลภาวะเนมสเปซและผลที่ตามมา - คุณสามารถใช้ชื่อที่ยุ่งยากน้อยลงได้

    การรวบรวมและการสื่อสารที่รวดเร็วยิ่งขึ้น

แต่คุณก็จบลงด้วยความยุ่งเหยิงที่ไม่ศักดิ์สิทธิ์เมื่อต้องแก้ไขไฟล์นี้ และคุณจะสูญเสียความเป็นโมดูลโดยนัย สามารถแก้ไขได้ด้วยการแบ่งซอร์สโค้ดออกเป็นหลายไฟล์และรวมไว้ในหน่วยการคอมไพล์เดียว

อย่างไรก็ตาม คุณต้องกำหนดแบบแผนบางประการเพื่อจัดการกับเรื่องนี้ สิ่งนี้จะขึ้นอยู่กับ toolchain ของคุณในระดับหนึ่ง แต่มีคำแนะนำทั่วไปบางประการ

    วางอินเทอร์เฟซสาธารณะไว้ในไฟล์ส่วนหัวแยกต่างหาก - คุณยังควรทำสิ่งนี้อยู่

    มีไฟล์ .c หลักหนึ่งไฟล์ที่รวมไฟล์ .c ลูกทั้งหมด ซึ่งอาจรวมถึงโค้ดสำหรับอินเทอร์เฟซแบบเปิดด้วย

    ใช้ตัวป้องกันคอมไพเลอร์เพื่อป้องกันไม่ให้ส่วนหัวส่วนตัวและโมดูลต้นทางถูกรวมไว้ในโมดูลการคอมไพล์ภายนอก

    ข้อมูลส่วนบุคคลและฟังก์ชันทั้งหมดจะต้องประกาศให้เป็นแบบคงที่

    รักษาความแตกต่างทางแนวคิดระหว่างไฟล์ .c และ .h สิ่งนี้ใช้แบบแผนที่มีอยู่ ความแตกต่างก็คือ คุณจะมีโฆษณาคงที่จำนวนมากในส่วนหัวของคุณ

    หาก toolchain ของคุณไม่ได้กำหนดสิ่งใด คุณไม่ควรระบุไฟล์การใช้งานส่วนตัว เช่น .c และ .h หากคุณใช้ยามที่เปิดใช้งาน พวกเขาจะไม่สร้างโค้ดและจะไม่แนะนำชื่อใหม่ใด ๆ (คุณอาจจบลงด้วยส่วนที่ว่างเปล่าบางส่วน) ข้อดีอย่างมากคือเครื่องมืออื่นๆ (เช่น IDE) จะจัดการไฟล์เหล่านี้ตามนั้น

นามสกุลไฟล์ไม่สำคัญสำหรับคอมไพเลอร์ภาษา C ส่วนใหญ่ ดังนั้นจึงใช้ได้

อย่างไรก็ตาม ขึ้นอยู่กับไฟล์หรือการตั้งค่าโปรเจ็กต์ของคุณ ไฟล์ c ที่รวมไว้อาจสร้างไฟล์อ็อบเจ็กต์แยกต่างหาก เมื่อเชื่อมโยงแล้ว อาจทำให้มีอักขระที่กำหนดซ้ำซ้อนได้

ภาษา C ไม่ได้ห้าม #include ประเภทนี้ แต่หน่วยการแปลผลลัพธ์จะต้องยังคงเป็น C ที่ถูกต้อง

ฉันไม่รู้ว่าคุณใช้โปรแกรมอะไรกับไฟล์ .prj หากคุณใช้บางอย่างเช่น "make" หรือ Visual Studio หรืออะไรก็ตาม เพียงตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าเป็นรายการไฟล์ที่ต้องคอมไพล์ โดยไม่มีไฟล์ที่ไม่สามารถคอมไพล์แยกกันได้

คุณสามารถรวมไฟล์ .C หรือ .CPP ในไฟล์ต้นฉบับอื่นๆ ได้อย่างถูกต้อง ขึ้นอยู่กับ IDE ของคุณ โดยปกติคุณสามารถป้องกันการลิงก์ซ้ำได้โดยการดูคุณสมบัติของไฟล์ต้นฉบับที่คุณต้องการรวม โดยทั่วไปโดยการคลิกขวาที่ไฟล์เหล่านั้นและคลิกที่คุณสมบัติ และยกเลิกการเลือก /ตรวจสอบการคอมไพล์/ลิงก์/ยกเว้นจากบิลด์หรืออื่น ๆ ตัวเลือก . อาจจะ. หรือคุณไม่สามารถรวมไฟล์ไว้ในโปรเจ็กต์ได้ ดังนั้น IDE จึงไม่รู้ด้วยซ้ำว่ามีไฟล์อยู่และจะไม่พยายามคอมไพล์มัน และด้วย makefiles คุณเพียงแค่ไม่ต้องใส่ไฟล์ลงไปเพื่อคอมไพล์และลิงก์

แก้ไข: ขออภัย ฉันให้คำตอบแทนที่จะตอบคำตอบอื่น :(

การรวมไฟล์ C ไว้ในไฟล์อื่นนั้นถูกกฎหมาย แต่ไม่แนะนำ เว้นแต่คุณจะทราบแน่ชัดว่าทำไมคุณถึงทำมันและสิ่งที่คุณพยายามทำให้สำเร็จ
ฉันค่อนข้างแน่ใจว่าหากคุณโพสต์เหตุผลที่คำถามของคุณจะถูกสื่อสารไปยังชุมชนที่นี่ คุณจะพบวิธีอื่นที่เหมาะสมในการบรรลุเป้าหมายของคุณ (หมายเหตุว่า "เกือบ" เนื่องจากเป็นไปได้ว่านี่เป็นวิธีแก้ปัญหาตามบริบท) .

ยังไงซะ ฉันพลาดส่วนที่สองของคำถามไป หากไฟล์ C รวมอยู่ในไฟล์อื่นและในเวลาเดียวกันก็รวมอยู่ในโปรเจ็กต์ คุณอาจประสบปัญหาเกี่ยวกับสัญลักษณ์ที่ซ้ำกัน สาเหตุที่ลิงก์อ็อบเจ็กต์ เช่น ฟังก์ชันเดียวกันจะถูกกำหนดสองครั้ง (เว้นแต่ว่าไฟล์เหล่านั้นจะเป็นแบบคงที่)

ขึ้นอยู่กับสภาพแวดล้อมการสร้างของคุณ (คุณจะไม่ระบุ) คุณอาจพบว่ามันทำงานตามที่คุณต้องการ

อย่างไรก็ตาม มีสภาพแวดล้อมมากมาย (ทั้ง IDE และ Makefile ที่ทำด้วยมือจำนวนมาก) ที่คาดหวังว่า *.c จะต้องถูกคอมไพล์ - หากสิ่งนี้เกิดขึ้น คุณจะพบข้อผิดพลาดของตัวเชื่อมโยงเนื่องจากสัญลักษณ์ที่ซ้ำกัน

โดยทั่วไปควรหลีกเลี่ยงการปฏิบัตินี้

หากคุณต้อง # รวมแหล่งที่มา (และโดยทั่วไปควรหลีกเลี่ยง) ให้ใช้ไฟล์อื่นสำหรับไฟล์นั้น

นี่สบายดีใช่ไหม? ใช่ มันจะรวบรวม

นี่แนะนำเหรอ? ไฟล์ no - .c จะถูกคอมไพล์เป็นไฟล์ .obj ซึ่งเชื่อมโยงหลังจากการคอมไพล์ (โดยตัวเชื่อมโยง) ไปยังไฟล์ปฏิบัติการ (หรือไลบรารี) ดังนั้นจึงไม่จำเป็นต้องรวมไฟล์ .c หนึ่งไฟล์ไว้ในอีกไฟล์หนึ่ง คุณมักจะต้องการสร้างไฟล์ .h ที่แสดงรายการฟังก์ชัน/ตัวแปรที่มีอยู่ในไฟล์ .c อื่น และรวมไฟล์ .h ไว้ด้วย

คุณสามารถใช้คอมไพเลอร์ gcc บน linux เพื่อลิงก์สองไฟล์กับเอาต์พุตเดียว สมมติว่าคุณมีไฟล์ c สองไฟล์ ไฟล์หนึ่งคือ "main.c" และอีกไฟล์คือ "support.c" ดังนั้นคำสั่งให้เชื่อมต่อสองตัวนี้ก็คือ

Gcc main.c support.c -o main.out

สองไฟล์นี้จะเชื่อมโยงกับ main.out หนึ่งไฟล์ ในการรันเอาต์พุตคำสั่งจะเป็น

./main.out

หากคุณใช้ฟังก์ชัน main.c ซึ่งได้รับการประกาศในไฟล์ support.c คุณควรประกาศฟังก์ชันดังกล่าวใน main และใช้คลาสพื้นที่เก็บข้อมูลภายนอกด้วย

ไฟล์ต้นฉบับ

ข้อความของโปรแกรม C สามารถแบ่งออกเป็นไฟล์ต้นฉบับได้หลายไฟล์ ไฟล์ต้นฉบับเป็นไฟล์ข้อความที่มีทั้งโปรแกรมหรือบางส่วน เมื่อโปรแกรมต้นฉบับถูกคอมไพล์ ไฟล์ต้นฉบับแต่ละไฟล์จะต้องถูกรวบรวมแยกกัน จากนั้นลิงก์ไปยังไฟล์อื่น ๆ โดยตัวเชื่อมโยง ไฟล์ต้นฉบับแต่ละไฟล์สามารถรวมกันเป็นไฟล์ต้นฉบับเดียว โดยคอมไพล์โดยรวมโดยใช้คำสั่งตัวประมวลผลล่วงหน้า #รวม.

ไฟล์ต้นฉบับสามารถประกอบด้วยคำสั่ง คำแนะนำคอมไพลเลอร์ การประกาศ และคำจำกัดความผสมกัน ความสมบูรณ์หมายความว่าออบเจ็กต์ เช่น คำจำกัดความของฟังก์ชัน โครงสร้างข้อมูล หรือชุดของคำสั่งการคอมไพล์แบบมีเงื่อนไขที่เกี่ยวข้องจะต้องอยู่ในไฟล์เดียว กล่าวคือ ไม่สามารถเริ่มต้นในไฟล์เดียวและดำเนินการต่อในอีกไฟล์หนึ่งได้

ไฟล์ต้นฉบับไม่จำเป็นต้องมีคำสั่งปฏิบัติการ บางครั้งการวางคำจำกัดความของตัวแปรไว้ในไฟล์เดียวก็สะดวก และในไฟล์อื่นๆ ให้ใช้ตัวแปรเหล่านี้โดยการประกาศตัวแปรเหล่านั้น ในกรณีนี้ คำจำกัดความของตัวแปรจะสามารถค้นหาและแก้ไขได้ง่าย ด้วยเหตุผลเดียวกัน ค่าคงที่ที่มีชื่อและคำจำกัดความของแมโครมักจะถูกรวบรวมเป็นไฟล์แยกกันและรวมผ่านคำสั่งตัวประมวลผลล่วงหน้า #รวมลงในไฟล์ต้นฉบับที่ต้องการ

คำแนะนำสำหรับคอมไพลเลอร์มักจะใช้กับส่วนเฉพาะของไฟล์ต้นฉบับเท่านั้น การดำเนินการของคอมไพเลอร์เฉพาะที่ระบุโดยคำแนะนำนั้นถูกกำหนดโดยการใช้งานเฉพาะของคอมไพเลอร์ C

ในตัวอย่างต่อไปนี้ โปรแกรมต้นฉบับประกอบด้วยไฟล์ต้นฉบับสองไฟล์ ฟังก์ชั่น หลักและ สูงสุดนำเสนอเป็นไฟล์แยกกัน การทำงาน หลักใช้ฟังก์ชัน สูงสุดในกระบวนการดำเนินการ

/* ไฟล์ต้นฉบับ 1 - ฟังก์ชั่นหลัก */

ภายนอก int max(int, int); /* ประกาศฟังก์ชัน */

main() /* นิยามฟังก์ชัน */

int w = หนึ่ง, x = สอง, y = สาม;

/* ไฟล์ต้นฉบับ 2 - ฟังก์ชั่นสูงสุด */

int max (a, b) /* นิยามฟังก์ชัน */

ในไฟล์ต้นฉบับแรกฟังก์ชัน สูงสุดประกาศแต่ไม่ได้กำหนดไว้ การประกาศฟังก์ชันนี้เรียกว่าการประกาศล่วงหน้า ช่วยให้คอมไพลเลอร์ควบคุมการเรียกฟังก์ชันก่อนที่จะถูกกำหนด นิยามฟังก์ชัน หลักมีการเรียกใช้ฟังก์ชัน สูงสุด.

บรรทัดที่ขึ้นต้นด้วยสัญลักษณ์ # คือคำสั่งของตัวประมวลผลล่วงหน้า คำสั่งระบุให้ผู้ประมวลผลล่วงหน้าทราบถึงความจำเป็นในการแทนที่ตัวระบุ ONE, TWO, THREE ด้วยค่าที่สอดคล้องกันในไฟล์ต้นฉบับแรก ขอบเขตของคำสั่งไม่ขยายไปยังไฟล์ต้นฉบับที่สอง

การเขียนโปรแกรม Kozlova Irina Sergeevna

27. ไฟล์ต้นฉบับ C++

27. ไฟล์ต้นฉบับ C++

โปรแกรม C++ มักจะมีไฟล์ต้นฉบับจำนวนมาก ซึ่งแต่ละไฟล์จะมีคำอธิบายประเภท ฟังก์ชัน ตัวแปร และค่าคงที่ เพื่อให้ชื่อถูกใช้ในไฟล์ต้นฉบับที่แตกต่างกันเพื่ออ้างถึงอ็อบเจ็กต์เฉพาะ จะต้องประกาศชื่อนั้นเป็นภายนอก ตัวอย่างเช่น:

sqrt คู่ภายนอก (สองเท่า); cin กระแสภายนอก

วิธีที่ง่ายที่สุดในการตรวจสอบความสอดคล้องระหว่างไฟล์ต้นฉบับคือการวางคำอธิบายเดียวกันในไฟล์แยกกัน ซึ่งเรียกว่าไฟล์ส่วนหัว จากนั้นจึงรวมซึ่งก็คือ คัดลอก ไฟล์ส่วนหัวเหล่านี้ในไฟล์ทั้งหมดที่ต้องการคำอธิบายเหล่านี้ ตัวอย่างเช่น หากคำอธิบายของ sqrt อยู่ในไฟล์ส่วนหัวของฟังก์ชันทางคณิตศาสตร์มาตรฐาน math.h และคุณจำเป็นต้องแยกรากที่สองของ 4 คุณจะใช้โปรแกรม:

เนื่องจากไฟล์ส่วนหัวปกติประกอบด้วยไฟล์ต้นฉบับจำนวนมาก จึงไม่มีคำอธิบายที่ไม่ควรทำซ้ำ

ในคำสั่ง include ให้รวมชื่อไฟล์ที่ปรากฏในวงเล็บเหลี่ยม เช่น อ้างถึงไฟล์ที่มีชื่อนั้นในไดเร็กทอรีมาตรฐาน (โดยปกติคือ /usr/include/CC) ไฟล์ที่เก็บไว้ในตำแหน่งอื่นมีการอ้างอิงโดยใช้ชื่อที่อยู่ในเครื่องหมายคำพูดคู่ ตัวอย่างเช่น:

#รวม "math1.h" #รวม "/usr/bs/math2.h"

จะรวม math1.h จากไดเร็กทอรีผู้ใช้ปัจจุบัน และ math2.h จากไดเร็กทอรี /usr/bs

มาดูกันว่าเราจะกำหนด ostream ประเภทสตรีมเอาต์พุตได้อย่างไร เพื่อให้ปัญหาง่ายขึ้น สมมติว่าประเภทบัฟเฟอร์คือ streambuf ประเภท streambuf ถูกกำหนดไว้ในตำแหน่งเดียวกับคำจำกัดความที่แท้จริงของ ostream ค่าของประเภทที่ผู้ใช้กำหนดจะระบุข้อมูลที่จำเป็นในการแสดงออบเจ็กต์ประเภทนั้นและการดำเนินการจำนวนมากเพื่อดำเนินการกับออบเจ็กต์เหล่านั้น คำจำกัดความประกอบด้วยสองส่วน: ส่วนปิด (ส่วนตัว) ซึ่งมีข้อมูลที่นักพัฒนาใช้เท่านั้น และส่วนเปิด (สาธารณะ) ซึ่งเป็นส่วนต่อประสานของประเภทกับผู้ใช้

จากหนังสือโปรแกรมและไฟล์ Windows ผู้เขียน คลิมอฟ เอ

ไฟล์ DBX ไฟล์ที่มีส่วนขยาย DBX เก็บบันทึก Outlook Express ไฟล์เหล่านี้เรียกว่า Message Bank ประกอบด้วยตัวอักษร ข้อความกลุ่มข่าวสาร ฯลฯ หากต้องการ คุณสามารถคัดลอกไฟล์เหล่านี้ไปยังสื่อบันทึกข้อมูลเพื่อถ่ายโอนข้อมูลไปยังคอมพิวเตอร์เครื่องอื่นได้

จากหนังสือการเขียนโปรแกรม ผู้เขียน คอซโลวา อิรินา เซอร์เกฟนา

ไฟล์ INF ในบทความนี้เราจะดูว่าไฟล์ INF คืออะไร วิธีใช้งานไฟล์ดังกล่าวเพื่อทำงานกับไฟล์อื่นๆ และรีจิสทรี สร้างทางลัด เปิดโปรแกรม ฯลฯ ดังที่คุณทราบ ผลิตภัณฑ์ซอฟต์แวร์ที่จริงจังไม่มากก็น้อยมักจะต้องมี พิเศษ

จากหนังสือ Win2K FAQ (v. 6.0) ผู้เขียน Shashkov Alexey

12. ความคิดเห็น ไฟล์ต้นฉบับ ความคิดเห็นคือชุดของอักขระที่คอมไพเลอร์ละเว้น แต่มีข้อ จำกัด บางประการกับอักขระชุดนี้ ภายในชุดอักขระที่แสดงความคิดเห็นจะต้องไม่มีอักขระพิเศษดังกล่าว

จากหนังสือ Microsoft Visual C++ และ MFC การเขียนโปรแกรมสำหรับ Windows 95 และ Windows NT ผู้เขียน โฟรลอฟ อเล็กซานเดอร์ เวียเชสลาโววิช

27. ไฟล์ต้นฉบับ C++ โปรแกรม C++ มักจะมีไฟล์ต้นฉบับจำนวนมาก ซึ่งแต่ละไฟล์จะมีคำอธิบายประเภท ฟังก์ชัน ตัวแปร และค่าคงที่ เพื่อให้แน่ใจว่าชื่อสามารถนำไปใช้ในไฟล์ต้นฉบับต่าง ๆ เพื่ออ้างอิงถึงวัตถุเฉพาะได้

จากหนังสือ UNIX: การสื่อสารกระบวนการ ผู้เขียน สตีเฟนส์ วิลเลียม ริชาร์ด

ไฟล์ ตามความต้องการยอดนิยม เรากำลังเปิดส่วนที่มีไฟล์ที่มีประโยชน์สำหรับ W2k ส่วนนี้ประกอบด้วยสองส่วน ส่วนแรกคือแพตช์อย่างเป็นทางการจาก Microsoft (ไม่ใช่ทั้งหมด แต่เฉพาะส่วนที่คิดว่าสำคัญที่สุดสำหรับเรา) และส่วนที่สองซึ่งจะรวมไฟล์ทั้งหมดที่กล่าวถึงในคำถามที่พบบ่อย เพียงยูทิลิตี้

จากหนังสือภาษาซีสำหรับคอมพิวเตอร์ส่วนบุคคล ผู้เขียน โบชคอฟ เอส.โอ.

จากหนังสือ KOMPAS-3D สำหรับนักเรียนและเด็กนักเรียน การวาดภาพ วิทยาการคอมพิวเตอร์ เรขาคณิต ผู้เขียน โบลชาคอฟ วลาดิมีร์

จากหนังสือ Undocumented and Little-Known Features of Windows XP ผู้เขียน คลีเมนโก โรมัน อเล็กซานโดรวิช

ไฟล์ต้นฉบับ ข้อความของโปรแกรม C สามารถแบ่งออกเป็นไฟล์ต้นฉบับหลายไฟล์ ไฟล์ต้นฉบับเป็นไฟล์ข้อความที่มีทั้งโปรแกรมหรือบางส่วน เมื่อโปรแกรมต้นฉบับถูกคอมไพล์ ไฟล์ต้นฉบับแต่ละไฟล์ที่เป็นส่วนประกอบ

จากหนังสือการเขียนโปรแกรมสำหรับ Linux แนวทางแบบมืออาชีพ โดย มิทเชลล์ มาร์ก

ภาคผนวก 2 ข้อมูลเริ่มต้นสำหรับการสร้างแบบจำลองแบบทึบ

จากหนังสือ UNIX: การพัฒนาแอปพลิเคชันเครือข่าย ผู้เขียน สตีเฟนส์ วิลเลียม ริชาร์ด

ภาคผนวก 3 ข้อมูลเบื้องต้นสำหรับตระกูลการสร้างแบบจำลอง

จากหนังสือ Wiki-Government [เทคโนโลยีสามารถทำให้รัฐบาลดีขึ้นได้อย่างไร ประชาธิปไตยแข็งแกร่งขึ้น และพลเมืองมีอิทธิพลมากขึ้น] โดย Novek Beth

ไฟล์ CPL จากสองสามย่อหน้าก่อนหน้านี้ คุณได้เรียนรู้การคำนวณเชิงทฤษฎีเกือบทั้งหมดที่จำเป็นในการทำงานกับโปรแกรม rundll32.exe ตอนนี้เราจะแสดงรายการความสามารถที่โปรแกรมนี้สามารถมอบให้กับผู้ใช้ได้ เริ่มต้นด้วยคำอธิบาย

จากหนังสือ UNIX - สภาพแวดล้อมการเขียนโปรแกรมสากล โดย ไพค์ ร็อบ

1.5.4. ซอร์สโค้ด Linux เป็นระบบโอเพ่นซอร์สใช่ไหม ผู้ตัดสินขั้นสุดท้ายว่าระบบทำงานอย่างไรคือซอร์สโค้ดของระบบเอง โชคดีสำหรับเราที่มันใช้งานได้ฟรี การกระจาย Linux ที่มีอยู่อาจมีซอร์สโค้ดสำหรับทั้งระบบและทั้งหมด

จากหนังสือของผู้เขียน

ก.3.5. ข้อความต้นฉบับของโปรแกรมเครื่องคิดเลข Listing A.3 แสดงข้อความของโปรแกรมที่คำนวณค่าของนิพจน์ postfix รายการ A.3 (calculator.c) ส่วนหลักของโปรแกรมเครื่องคิดเลข/* การคำนวณในรูปแบบเอกนารี *//* รหัสบรรทัดเดียวจะถูกส่งไปยังอินพุตโปรแกรม

จากหนังสือของผู้เขียน

ภาคผนวก D ซอร์สโค้ดต่างๆ D.1 ไฟล์ส่วนหัวของ unp.h เกือบทุกโปรแกรมในหนังสือเล่มนี้เริ่มต้นด้วยการรวมไฟล์ส่วนหัวของ unp.h ดังแสดงในรายการ D.1 ไฟล์นี้ประกอบด้วยไฟล์ส่วนหัวของระบบมาตรฐานทั้งหมดที่จำเป็นสำหรับการดำเนินการ

จากหนังสือของผู้เขียน

จากหนังสือของผู้เขียน

ภาคผนวก 3 ซอร์สโค้ดสำหรับเครื่องคิดเลขเฉพาะกิจ ไฟล์เหล่านี้มีโค้ดทั้งหมดจาก "The Unix Programming Environment" โดย Brian Kernighan และ Rob Pike (Prentice Hall, 1984, ISBN 0-13-937681-X) การแจกจ่าย hoc6 ที่แยกต่างหากประกอบด้วยการแก้ไขใดๆ ที่เรานำไปใช้กับสิ่งนั้น เวอร์ชันในไฟล์นี้มาจากหนังสือ ลิขสิทธิ์ © Lucent Technologies, 1997 สงวนลิขสิทธิ์ อนุญาตให้ใช้ คัดลอก แก้ไข และแจกจ่ายซอฟต์แวร์นี้และเอกสารประกอบสำหรับ

สนับสนุน.microsoft

เมื่อคุณปรับเปลี่ยนแฟ้มต้นฉบับใน Visual C++ และบันทึก บรรทัดจะต้องลงท้ายด้วยชุด "CR/LF" [การขึ้นบรรทัดใหม่ การป้อนบรรทัด] บนระบบ UNIX บรรทัดจะลงท้ายด้วย "LF" ดังนั้น เมื่อดูไฟล์ที่ถูกแก้ไขในกลุ่ม Windows บนระบบ UNIX คุณอาจเห็นอักขระ "^M" จำนวนมากในบรรทัด สิ่งนี้จะเกิดขึ้นเฉพาะเมื่อคุณใช้โปรแกรมแก้ไขที่ไม่รู้วิธีตีความไฟล์ Windows Visual C++ สามารถเปิดไฟล์ที่มีบรรทัดลงท้ายด้วยการสร้าง UNIX LF หากคุณแก้ไขไฟล์นี้และบันทึกจาก Visual C++ ไฟล์นั้นจะถูกบันทึกในรูปแบบ Windows (คุณจะเห็น CR/LF ไม่ใช่ LF ที่เคยอยู่ในระบบ)

บทความนี้อธิบายขั้นตอนในการบันทึกไฟล์ที่ถูกแก้ไขที่สร้างขึ้นบนแพลตฟอร์ม Windows ในรูปแบบที่สามารถใช้ได้กับระบบ UNIX

บันทึก: Visual C++.NET IDE มีฟังก์ชันสำหรับบันทึกไฟล์ในรูปแบบ UNIX ใน IDE ให้บันทึกไฟล์โดยใช้ บันทึกเป็น...ให้เลือกบันทึกจากรายการแบบเลื่อนลง บันทึกด้วยการเข้ารหัส...แล้วกดปุ่มthrn ใช่- เลือกการเข้ารหัสสตริงจากรายการแบบเลื่อนลง ยูนิกซ์ (LF)แล้วคลิกปุ่ม ตกลง.

คุณสามารถใช้ขั้นตอนต่อไปนี้เพื่อสร้างโครงการแอปพลิเคชันคอนโซล Win32 ที่แปลงไฟล์ที่มี "CR/LF" เพื่อสิ้นสุดบรรทัดสำหรับ "LF":

  1. หากต้องการสร้างใหม่โดยใช้แอปพลิเคชันคอนโซล Win32 ซึ่งเป็นโปรเจ็กต์ว่างชื่อ DOS2UNIX
  2. จาก ไฟล์เมนู ให้กดปุ่ม ใหม่แล้วคลิกปุ่ม ไฟล์แท็บ
  3. เลือก ไฟล์ต้นฉบับ C/C++และกรอกชื่อไฟล์ใหม่ DOS2UNIX.cpp
  4. วางโค้ดต่อไปนี้ลงใน DOS2UNIX.cpp:

    #รวม #รวม #รวม ใช้เนมสเปซมาตรฐาน; int main(int argc, char* argv) ( ถ้า(argc !=2) ( ศาล<< "Please specify: dos2unix filename" << endl; return 0; } char ch; char temp="\0"; //Open the file for reading in binarymode. ifstream fp_read(argv, ios_base::in \ / ios_base::binary); sprintf(temp, "%s.temp", argv); //Create a temporary file for writing in the binary mode. This //file will be created in the same directory as the input file. ofstream fp_write(temp, ios_base::out \ / ios_base::trunc \ / ios_base::binary); while(fp_read.eof() != true) { fp_read.get(ch); //Check for CR (carriage return) if((int)ch == 0x0D) continue; if (!fp_read.eof())fp_write.put(ch); } fp_read.close(); fp_write.close(); //Delete the existing input file. remove(argv); //Rename the temporary file to the input file. rename(temp, argv); //Delete the temporary file. remove(temp); return 0; }

  5. จาก การก่อสร้างเมนู ให้กดปุ่ม การสร้าง DOS2UNIX.exeเพื่อสร้างไฟล์ EXE

คุณอาจต้องทดสอบไฟล์ exe นี้เพื่อดูว่าไฟล์ทำงานถูกต้องหรือไม่ เมื่อต้องการทำเช่นนี้ ให้เปิดแฟ้มในตัวแก้ไขไบนารีของ Visual C++ เมื่อคุณเลือก เปิดในกลุ่ม ไฟล์เมนูโดยเลือก DOS2UNIX.ex การตั้งค่า เปิดเป็นถึงใคร ไบนารี่แล้วคลิก เปิด- ตัวอย่างเช่น หากไฟล์มี "hellocrlfworld" ข้อมูลไฟล์ไบนารี (เลขฐานสิบหก) จะมีลักษณะดังนี้:

48 65 6 ค 6 ค 6F 0 ง 0A 57 6F 72 6 ค 64

นี่เทียบเท่ากับ:

สวัสดี
โลก

ที่พรอมต์คำสั่ง ให้เรียกใช้ dos2unix.exe - ถัดไป เปิดไฟล์ในตัวแก้ไขไบนารี Visual C++ คุณจะเห็นว่า 0x0d s ถูกลบออก จนกว่าคุณจะเปลี่ยนไฟล์และบันทึกใน Visual C++ 0x0d s จะไม่ปรากฏขึ้น

สามารถใช้ร่วมกับ Visual C++ Automation Model เพื่อทำให้กระบวนการทั้งหมดเป็นแบบอัตโนมัติ คุณสามารถเขียนสคริปต์แมโคร Microsoft Visual Basic แบบธรรมดาเพื่อเรียกใช้เครื่องมือนี้ได้ แต่ต้องเพิ่มเครื่องมือก่อน บริการเมนูมีลักษณะดังนี้:

  1. จาก บริการเมนู ให้กดปุ่ม การตั้งค่าแล้วคลิกปุ่ม บริการแท็บ
  2. ระบุชื่อเช่น DOS2UNIX และระบุเส้นทางแบบเต็มไปยังไฟล์ Dos2unix.exe ทีมแก้ไขฟิลด์
  3. ตั้งค่าอาร์กิวเมนต์เป็น $(Filename)$(FileExt)
  4. ระบุไดเร็กทอรีต้นทาง $(WkspDir) (ระบุพาธของคุณเอง)

หากต้องการตรวจสอบการทำงานของโปรแกรม ให้เปิดไฟล์ในตัวแก้ไข Visual C++ จากนั้นเปิดไฟล์ บริการเมนูเริ่ม ดอสทูยูนิกซ์วิธี. คุณจะเห็นว่าไฟล์ที่เปิดในตัวแก้ไขได้ลบอักขระ CR ทั้งหมดออกแล้ว

หากคุณต้องการทำให้กระบวนการนี้เป็นแบบอัตโนมัติ ให้จัดการเพื่อให้ทุกครั้งที่คุณบันทึกไฟล์ที่เปิดอยู่ในโปรแกรมแก้ไข Visual C++ DOS2UNIX.exe จะถูกเรียกให้ลบ 0x0d s จากนั้นใช้แมโคร VBScript ต่อไปนี้:

"เหตุการณ์นี้เกิดขึ้นทุกครั้งที่เอกสารถูกบันทึกในตัวแก้ไข VC++ Sub Application_DocumentSave(theDocument) "ซึ่งจะเรียกเครื่องมือผู้ใช้ในเมนูเครื่องมือ "เปลี่ยนตัวเลขขึ้นอยู่กับสิ่งที่คุณมี โดยค่าเริ่มต้นคุณมีเพียง 6 เครื่องมือภายใต้เมนู Tools ดังนั้นเครื่องมือ DOS2UNIX จะเป็นอันดับที่ 7 ExecuteCommand "UserTool7" สิ้นสุดย่อย

รหัส VBScript นี้จะใช้งานได้เฉพาะเมื่อคุณเปิดไฟล์ใน Visual C++ Editor นี่เป็นวิธีเดียวที่จะเรียกไฟล์ exe จากมาโคร VBScript (ไม่สามารถส่งพารามิเตอร์มาโคร VBScript ได้) คุณสามารถเขียนแทนได้และจะมีความยืดหยุ่นมากขึ้น เรียกใช้เครื่องมือ "DOS2UNIX.exe" จาก Add-in โดยไม่ต้องเพิ่มเข้าไป บริการเมนู.

ใน Visual C++ โดยใช้แมโคร VBScript ที่ให้มา:

  1. เปิดไฟล์ที่มีอยู่ด้วยนามสกุล .dsm หรือสร้างขึ้นใหม่
  2. วางรหัสที่ให้ไว้ก่อนหน้านี้ลงในไฟล์
  3. ใน Visual C++ ให้ทำดังต่อไปนี้:
    1. จาก บริการเมนู ให้กดปุ่ม การตั้งค่า.
    2. คลิกปุ่ม ไฟล์มาโครและไฟล์เสริมแท็บ
    3. คลิกปุ่ม ทบทวนโหลดไฟล์ .dsm ที่มีมาโคร เมื่ออยู่ในไฟล์ .dsm ก็ถูกเลือกเข้ามา ทบทวนกล่องโต้ตอบ ไฟล์จะปรากฏขึ้นมา ส่วนเสริมและมาโครรายการไฟล์โดยใช้ช่องทำเครื่องหมายที่เลือกอยู่ข้างๆ
    4. คลิกปุ่ม ปิดเพื่อดำเนินการต่อ

ตอนนี้ หากคุณเปิดไฟล์ในตัวแก้ไข Visual C++ และบันทึกจากไฟล์ ไฟล์เมนูที่เรียกว่ามาโครและ 0x0d ทั้งหมดจะถูกลบออกจากไฟล์ที่เปิด เนื่องจากการดำเนินการนี้จะส่งผลต่อไฟล์ใดๆ ที่บันทึกไว้ต่อจากนี้และนำไปใช้กับโครงการใดๆ ที่คุณเปิดในอนาคต โปรดแน่ใจว่าได้ปิดการใช้งานมาโครจาก บริการเมนูโดยใช้ การตั้งค่า(ยกเลิกการเลือกช่องถัดจากมาโคร)



คุณสามารถรวมไฟล์ .C หรือ .CPP ในไฟล์ต้นฉบับอื่นๆ ได้อย่างถูกต้อง ขึ้นอยู่กับ IDE ของคุณ โดยปกติคุณสามารถป้องกันการลิงก์ซ้ำได้โดยการดูคุณสมบัติของไฟล์ต้นฉบับที่คุณต้องการรวม โดยทั่วไปโดยการคลิกขวาที่ไฟล์เหล่านั้นและคลิกที่คุณสมบัติ และยกเลิกการเลือก /ตรวจสอบการคอมไพล์/ลิงก์/ยกเว้นจากบิลด์หรืออื่น ๆ ตัวเลือก . อาจจะ. หรือคุณไม่สามารถรวมไฟล์ไว้ในโปรเจ็กต์ได้ ดังนั้น IDE จึงไม่รู้ด้วยซ้ำว่ามีไฟล์อยู่และจะไม่พยายามคอมไพล์มัน และด้วย makefiles คุณเพียงแค่ไม่ต้องใส่ไฟล์ลงไปเพื่อคอมไพล์และลิงก์

แก้ไข: ขออภัย ฉันให้คำตอบแทนที่จะตอบคำตอบอื่น :(

ขึ้นอยู่กับสภาพแวดล้อมการสร้างของคุณ (คุณจะไม่ระบุ) คุณอาจพบว่ามันทำงานตามที่คุณต้องการ

อย่างไรก็ตาม มีสภาพแวดล้อมมากมาย (ทั้ง IDE และ Makefile ที่ทำด้วยมือจำนวนมาก) ที่คาดหวังว่า *.c จะต้องถูกคอมไพล์ - หากสิ่งนี้เกิดขึ้น คุณจะพบข้อผิดพลาดของตัวเชื่อมโยงเนื่องจากสัญลักษณ์ที่ซ้ำกัน

โดยทั่วไปควรหลีกเลี่ยงการปฏิบัตินี้

หากคุณต้อง # รวมแหล่งที่มา (และโดยทั่วไปควรหลีกเลี่ยง) ให้ใช้ไฟล์อื่นสำหรับไฟล์นั้น

ฉันคิดว่าฉันจะแชร์สถานการณ์ที่ทีมของฉันตัดสินใจรวมไฟล์ .c สถาปนิกของเราส่วนใหญ่ประกอบด้วยโมดูลที่แยกส่วนผ่านระบบส่งข้อความ ตัวจัดการข้อความเหล่านี้เป็นแบบสาธารณะและเรียกใช้ฟังก์ชันผู้ปฏิบัติงานแบบคงที่ในพื้นที่จำนวนมากเพื่อทำงานของตน ปัญหาเกิดขึ้นเมื่อพยายามรับความครอบคลุมสำหรับกรณีทดสอบเดี่ยวของเรา เนื่องจากวิธีเดียวที่จะใช้โค้ดการใช้งานส่วนตัวนี้คือทางอ้อมผ่านอินเทอร์เฟซข้อความทั่วไป ด้วยคุณสมบัติบางอย่างของผู้ปฏิบัติงานบนตัก สิ่งนี้พิสูจน์แล้วว่าเป็นฝันร้ายเพื่อให้แน่ใจว่าครอบคลุมได้อย่างเหมาะสม

การรวมไฟล์ .c ทำให้เรามีโอกาสเข้าถึงฟันเฟืองในเครื่อง ซึ่งสนุกมากสำหรับเราในการทดสอบ

การรวมไฟล์ C ไว้ในไฟล์อื่นนั้นถูกกฎหมาย แต่ไม่แนะนำ เว้นแต่คุณจะทราบแน่ชัดว่าทำไมคุณถึงทำมันและสิ่งที่คุณพยายามทำให้สำเร็จ
ฉันค่อนข้างแน่ใจว่าหากคุณโพสต์เหตุผลที่คำถามของคุณจะถูกสื่อสารไปยังชุมชนที่นี่ คุณจะพบวิธีอื่นที่เหมาะสมในการบรรลุเป้าหมายของคุณ (หมายเหตุว่า "เกือบ" เนื่องจากเป็นไปได้ว่านี่เป็นวิธีแก้ปัญหาตามบริบท) .

ยังไงซะ ฉันพลาดส่วนที่สองของคำถามไป หากไฟล์ C รวมอยู่ในไฟล์อื่นและในเวลาเดียวกันก็รวมอยู่ในโปรเจ็กต์ คุณอาจประสบปัญหาเกี่ยวกับสัญลักษณ์ที่ซ้ำกัน สาเหตุที่ลิงก์อ็อบเจ็กต์ เช่น ฟังก์ชันเดียวกันจะถูกกำหนดสองครั้ง (เว้นแต่ว่าไฟล์เหล่านั้นจะเป็นแบบคงที่)

ภาษา C ไม่ได้ห้าม #include ประเภทนี้ แต่หน่วยการแปลผลลัพธ์จะต้องยังคงเป็น C ที่ถูกต้อง

ฉันไม่รู้ว่าคุณใช้โปรแกรมอะไรกับไฟล์ .prj หากคุณใช้บางอย่างเช่น "make" หรือ Visual Studio หรืออะไรก็ตาม เพียงตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าเป็นรายการไฟล์ที่ต้องคอมไพล์ โดยไม่มีไฟล์ที่ไม่สามารถคอมไพล์แยกกันได้

คุณควรเพิ่มส่วนหัวเช่นนี้

#รวม

หมายเหตุ: ต้องวางทั้งสองไฟล์ไว้ในที่เดียวกัน

คุณสามารถใช้คอมไพเลอร์ gcc บน linux เพื่อลิงก์สองไฟล์กับเอาต์พุตเดียว สมมติว่าคุณมีไฟล์ c สองไฟล์ ไฟล์หนึ่งคือ "main.c" และอีกไฟล์คือ "support.c" ดังนั้นคำสั่งให้เชื่อมต่อสองตัวนี้ก็คือ

Gcc main.c support.c -o main.out

สองไฟล์นี้จะเชื่อมโยงกับ main.out หนึ่งไฟล์ ในการรันเอาต์พุตคำสั่งจะเป็น

./main.out

หากคุณใช้ฟังก์ชัน main.c ซึ่งได้รับการประกาศในไฟล์ support.c คุณควรประกาศฟังก์ชันดังกล่าวใน main และใช้คลาสพื้นที่เก็บข้อมูลภายนอกด้วย

นามสกุลไฟล์ไม่สำคัญสำหรับคอมไพเลอร์ภาษา C ส่วนใหญ่ ดังนั้นจึงใช้ได้

อย่างไรก็ตาม ขึ้นอยู่กับไฟล์หรือการตั้งค่าโปรเจ็กต์ของคุณ ไฟล์ c ที่รวมไว้อาจสร้างไฟล์อ็อบเจ็กต์แยกต่างหาก เมื่อเชื่อมโยงแล้ว อาจทำให้มีอักขระที่กำหนดซ้ำซ้อนได้



 


อ่าน:


ใหม่

วิธีฟื้นฟูรอบประจำเดือนหลังคลอดบุตร:

การใช้สไตล์ใน Excel วิธีสร้างสไตล์ใหม่ของคุณเอง

การใช้สไตล์ใน Excel วิธีสร้างสไตล์ใหม่ของคุณเอง

หากคุณใช้ตัวเลือกเดียวกันนี้ในการจัดรูปแบบเซลล์ในเวิร์กชีตในสเปรดชีตของคุณอย่างสม่ำเสมอ การสร้างสไตล์การจัดรูปแบบ...

เกิดข้อผิดพลาดอะไรระหว่างการติดตั้ง?

เกิดข้อผิดพลาดอะไรระหว่างการติดตั้ง?

หมายเหตุ: โปรแกรม AutoLISP สามารถทำงานได้บน AutoCAD เวอร์ชันเต็มเท่านั้น โดยจะไม่ทำงานภายใต้ AutoCAD LT (ไม่รวมกรณีโหลด...

สถานภาพทางสังคมของบุคคลในสังคม

สถานภาพทางสังคมของบุคคลในสังคม

เสนอแนะสิ่งที่กำหนดการเลือกสถานะหลักของบุคคล การใช้ข้อความและข้อเท็จจริงของชีวิตทางสังคม ตั้งสมมติฐานสองข้อ และ...

การตีความข้อผิดพลาดแบบเต็ม

การตีความข้อผิดพลาดแบบเต็ม

มีผู้ใช้จำนวนไม่น้อยที่ต้องเผชิญกับปรากฏการณ์หน้าจอสีน้ำเงินแห่งความตาย จะทำอย่างไร (Windows 7 มักเกิดปัญหานี้บ่อยที่สุด)...

ฟีดรูปภาพ อาร์เอสเอส