จะทำให้มันชัดเจนได้อย่างไรว่าฟังก์ชั่นนั้นถูกเข้าถึงจากภายนอก?


9

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

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

ดังนั้นฉันสงสัยว่าจะทำให้มันชัดเจนมากว่าฟังก์ชั่นเหล่านั้นถูกเรียกจากสถานที่คลุมเครือ

  • พวกเขาควรจะเป็นstaticหรือextern(และเปิดเผยพวกเขาใน.h)?
  • ฉันควรจะใส่คำใบ้ไว้ในชื่อของฟังก์ชั่นหรือไม่?
  • หรือมันเพียงพอที่จะใส่ความคิดเห็น "เรียกโดย X"?

1
นั่นเป็นคำถามที่ยอดเยี่ยม โซลูชันของฉัน (ซึ่งฉันไม่ได้มีความสุขเกินไปด้วยเหตุนี้ฉันจึงใส่ไว้ในความคิดเห็นเท่านั้น) คือการสร้างไฟล์ส่วนหัวหลายไฟล์ชื่อที่สมเหตุสมผลและจัดกลุ่มฟังก์ชันในขอบเขตที่ฉันต้องการให้มี สำหรับห้องสมุด AStar ฉันได้ทำฉันมี AStar.h, AStar_private.h, AStar_packagePrivate.h ฯลฯ ...
Shivan Dragon

คำตอบ:


2

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

เนื่องจากการเชื่อมโยงในทุกการใช้งาน CI รู้ว่าเป็นสัญลักษณ์สิ่งใดก็ตามที่เรียกฟังก์ชันต้องอ้างถึงสัญลักษณ์ของมัน:

foo();  /* Direct */

some_function_pointer_t funcs[] = { &foo, &bar, &baz };  /* Indirect */

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


1

ดังนั้นฉันจึงหลงทางที่จะทำให้มันชัดเจนมากว่าฟังก์ชั่นเหล่านั้นถูกเรียกมาจากบางตำแหน่งที่คลุมเครือ

กำหนด "ปิดบัง"
วิธีการที่ควรเปิดเผยผ่าน "อินเตอร์เฟส" ที่กำหนดไว้อย่างดีและตามที่ Shivan Dragon ได้แนะนำไว้แล้ว "อินเตอร์เฟส" เหล่านั้นเป็นไฟล์. h ของคุณ หากคุณไม่ให้โปรแกรมอื่นกับไฟล์ส่วนหัว "ถูกต้อง" ก็ไม่สามารถเรียกวิธีการนี้ได้

พวกเขาควรจะคงที่หรือภายนอก (และเปิดเผยพวกเขาใน. h)?

static อาจใช้ได้ตราบใดที่คุณไม่มีคลาส [- like constructs] ที่มีข้อมูลอินสแตนซ์
externหมายความว่าคุณไม่ได้ใช้มันเลย การใช้งานคือ "ได้รับ" จากที่อื่นในระหว่างกระบวนการเชื่อมโยง

ฉันควรจะใส่คำใบ้ไว้ในชื่อของฟังก์ชั่นหรือไม่?

หรือมันเพียงพอที่จะใส่ความคิดเห็น "เรียกโดย X"?

ไม่ได้อย่างแน่นอน.

ความคิดเห็นเช่นนี้ไม่ว่าจะมีความหมายดีเพียงใดล้าสมัยเมื่อคุณเขียนเสร็จ


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

1
เกี่ยวกับจุดที่สองเท่าที่ความเข้าใจของฉันไปวัตถุกำหนดที่ขอบเขตไฟล์มีการเชื่อมโยงภายนอกโดยค่าเริ่มต้น ดังนั้นexternคำหลัก redundant`
Vorac

0

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


0

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

static เพราะฉันพยายามซ่อนสิ่งที่ฉันซ่อนได้มากเท่าที่ฉันจะซ่อนได้

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


0

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

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.