ฉันควรหยุดใช้คำว่า C / C ++ หรือไม่


140

ฉันเข้าใจ C และ C ++ เป็นภาษาที่แตกต่างกัน แต่เมื่อฉันเรียนรู้ C ++ ฉันมักจะบอกเสมอว่าC เป็นชุดย่อยของ C ++หรือ C ++ คือ C พร้อมคลาส และนั่นเป็นเรื่องจริงจนกระทั่งการปรากฏตัวของ C ++ x0, C ++ 11 (หรือ C ++ ที่ทันสมัยโดยทั่วไป 11/14/17) อันที่จริง (โดยเฉพาะเมื่อทำงานกับระบบฝังตัว) มีโอกาสมากที่จะพบรหัสที่เขียนใน C ++ แต่มีชิ้นส่วนจำนวนมากที่เขียนด้วยภาษา C ล้วนๆ ที่นี่ฉันมีคำถามหลายข้อ:

  1. ฉันควรหยุดใช้คำว่า C / C ++ หรือไม่
  2. หากคำตอบของ # 1 คือใช่ฉันจะเรียกโปรแกรมที่ใช้ผสม C และ C ++ ได้อย่างไร
  3. เนื่องจากทั้งสองภาษาเป็น 'ที่แตกต่างกัน' เป็นไปได้ว่าในบางจุดคอมไพเลอร์ C ++ จะหยุดการสนับสนุนโค้ดที่เขียนในภาษา C (เนื่องจาก c ++ สมัยใหม่แยกออกจากความคิด C สำหรับสิ่งพื้นฐานเช่นพอยน์เตอร์, การจัดการหน่วยความจำแบบไดนามิก ฯลฯ )
  4. ตอนนี้มีการทำงานร่วมกันระหว่างคนที่สร้างมาตรฐานของ C / C ++ เพื่อให้เข้ากันได้หรือไม่
  5. หาก # 4 คือใช่การทำงานร่วมกันดังกล่าวอาจสิ้นสุดลงในอนาคตอันใกล้ด้วยรูปลักษณ์ของc ++ ที่ทันสมัย (11/14/17)

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


35
และนั่นก็เงียบจริงจนกระทั่งการปรากฏตัวของ C ++ x0, C ++ 11ไม่, C89 ไม่ใช่เซตย่อยของ C ++ 98

35
Should I stop using the term C/C++. ใช่. สิ่งนี้จะถูกใช้โดยนายหน้าและทรัพยากรบุคคล วิศวกรจะใช้คำCหรือC++เป็นภาษาอิสระ หากคุณพบวิศวกรที่ผสมคำนั้นให้หลีกเลี่ยง
Martin York

8
@ LokiAstari: จริงเหรอ? ฉันเดาว่านักพัฒนา SQLite เป็นทรัพยากรบุคคลเนื่องจากพวกเขาไม่มีตำแหน่งที่เปิด นี่เป็นมุมมองที่ จำกัด อย่างไม่น่าเชื่อ (โปรดไปและลดคำตอบของฉันตามที่คนอื่น ๆ ในสถานการณ์ของคุณทำ)

4
@greyfade: มันไม่ดีเลยที่จะคิดว่าใครก็ตามสามารถอ้างสิทธิ์ตามลำดับตัวอักษรที่เห็นได้ทั่วไป "C / C ++" อาจเป็นชื่อที่เลือกสำหรับบางภาษา แต่นั่นไม่ได้หมายความว่าการใช้ "C / C ++" หมายถึงภาษานั้นมากกว่าที่ฉันจะคัดลอกเว็บไซต์นั้นและแทนที่ "C / C ++" โดย "C ++ 1z" ที่การสนทนาทั้งหมดของมาตรฐาน C ++ ฉบับร่างจะใช้คำศัพท์ที่ผิด พูดง่ายๆคือสตริง "C / C ++" ไม่เคยพูดถึงภาษาตลกที่ชื่อ "C / C ++" และจะไม่
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "ในความหมายทางคณิตศาสตร์ที่เข้มงวด C ไม่ใช่เซตย่อยของ C ++ ... อย่างไรก็ตาม C ++ สนับสนุนเทคนิคการเขียนโปรแกรมที่สนับสนุนโดย C ... ผิดปกติเพื่อให้สามารถแปลงหมื่นบรรทัดของ C เป็น C-style C ++ ในเวลาไม่กี่ชั่วโมงดังนั้น C ++ จึงเป็น superset ของ ANSI C มากเท่ากับ ANSI C เป็น superset ของ K&R C และ ISO C ++ เป็น superset ของ C ++ ตามที่มีอยู่ในปี 1985 C ที่เขียนมาอย่างดีมีแนวโน้มที่จะถูกต้องตามกฎหมายเช่นกันตัวอย่างเช่นทุกตัวอย่างใน Kernighan & Ritchie: "ภาษาการเขียนโปรแกรม C (รุ่นที่ 2)" เป็นโปรแกรม C ++ ด้วย "
Ben

คำตอบ:


183

C ไม่เคยเป็นเซตย่อยของ C ++ int new;ตัวอย่างที่เห็นได้ชัดที่สุดของที่นี่คือ สิ่งนี้เป็นจริงตั้งแต่ C89 และ C ++ 98 และภาษามีการเติบโตต่อเนื่องจากกันและกันเมื่อมาตรฐานใหม่ออกมา

ฉันควรหยุดใช้คำว่า C / C ++

ใช่

หากคำตอบของ # 1 คือใช่ฉันจะเรียกโปรแกรมที่ใช้ผสม C และ C ++ ได้อย่างไร

ไฟล์ต้นฉบับเขียนด้วยภาษาหนึ่งหรืออีกภาษาหนึ่ง โปรแกรมสามารถประกอบด้วยรหัสจากหลายภาษาที่ทำงานร่วมกันหรือปฏิบัติการที่สร้างขึ้นโดยการเชื่อมโยงวัตถุที่รวบรวมที่แตกต่างกัน คุณจะบอกว่าโปรแกรมเขียนด้วยภาษา C และ C ++ "C / C ++" ไม่ใช่ภาษา

ระบุว่าทั้งสองเป็นภาษา 'แตกต่างกัน' เป็นไปได้ว่าในบางจุดคอมไพเลอร์ C ++ หยุดสนับสนุนโค้ดที่เขียนในภาษา C

3) พวกเขาไม่เคยทำ char *a = malloc(10);. CและC ++ไม่เคยเข้ากันได้อย่างเต็มที่อย่างน้อยตราบใดที่พวกเขามีมาตรฐาน ISO (ฉันไม่ทราบรายละเอียดทั้งหมดเกี่ยวกับวันก่อนมาตรฐาน) คลิกลิงก์หรือดูไฟล์ที่ใช้ได้กับ C89 ขึ้นไป แต่ไม่สามารถใช้ได้ภายใต้มาตรฐาน C ++ ใด ๆ

4) ไม่มีเลย, คณะทำงานต่างก็มีความตระหนักซึ่งกันและกัน แต่มาตรฐานก็เป็นตัวตัดสินที่ดีที่สุดสำหรับพวกเขา

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

ฉันมักจะรู้สึกว่ามันคุ้มค่าที่จะกล่าวถึงว่า C เป็นเซตย่อยของ Objective-C


59
Objective-C ได้รับการออกแบบมาโดยเฉพาะให้เป็น superset ที่เข้มงวดของ C โดยไม่มีไวยากรณ์ที่ขัดแย้งกันและระบบวัตถุมุมฉากอย่างเต็มที่ สิ่งนี้นำไปสู่ความสุดยอดที่คุณสามารถนำส่วน "วัตถุประสงค์" ของ "Objective-C" และใส่ลงไปในภาษาอื่น ๆ ได้เช่นสร้าง Objective-MODULA-2 และที่โด่งดังที่สุดคือแอปเปิ้ล Objective-C ++ ซึ่งมีทั้งระบบออโธกอนอลที่ไม่โต้ตอบและไม่รวมระบบสองระบบ
Jörg W Mittag

20
@ manasonwheeler ถ้า OP ต้องการดูว่า superset ที่แท้จริงของ C นั้นเป็นอย่างไร
xhainingx

26
"ไฟล์ต้นฉบับเขียนเป็นภาษาหนึ่งหรืออีกภาษาหนึ่ง" บอกต่อโปรแกรมของฉันที่รวบรวมได้อย่างสมบูรณ์ทั้ง C99 มาตรฐานและ C ++ 89 ภาษาทั้งสองเป็นชุดย่อยของอีกชุดหนึ่ง แต่มีจุดตัดของชุดสองชุดที่มีการกำหนดเป้าหมายอย่างกว้างขวาง ดู Lua และคณะ
munificent

28
@munificent ฉันสามารถเขียนรหัส C ++ ซึ่งสามารถเรียกใช้ผ่านjavacเช่นกัน แต่สิ่งที่จะเป็นจุดหรือไม่
xhainingx

22
@munificent ตัวอย่างของโปรแกรมที่สามารถคอมไพล์ในสามภาษา - C, / bin / sh, และ f77 - เป็นรายการ applin.c ไปยัง IOCCC 1986. ตามคำจำกัดความของคุณ, แท็กC/Fortran/shสมเหตุสมผลแล้วหรือ? ioccc.org/years-spoiler.html#1986
Sjoerd

108

มีมีจะเป็นเหตุผลที่ว่าทำไมคำเหล่านี้มารวมกันจึงมักจะเป็น ในขณะที่คุณไม่ควรบอกครูซีของคุณว่าภาษาของเขาเป็นส่วนย่อยของ C ++ แต่มีความจริงบางอย่างอยู่ที่นี่ คนอื่นได้เปิดเผยมุมมองของครูแล้ว นี่เป็นสิ่งที่ดีมาก (และแสดงตัวอย่างเป็นต้น) แต่เราไม่ได้อยู่ในหอคอยงาช้างหรือหนังสือ

เจ้านายใหญ่ของคุณไม่สนใจภาษาที่คุณใช้น้อยลง ถ้าเขารู้เกี่ยวกับการเขียนโปรแกรมเพียงบอกเขาว่าคุณใช้ C / C ++ และมันจะดูเหมือนว่า "ฉันใช้ภาษาที่ต้องรวบรวมรหัสเครื่องด้วย DLL และสิ่งที่ซับซ้อนทั้งหมด" นี่คือส่วน "การสื่อสารภายนอก"

หากคุณสร้างห้องสมุดที่สามารถเชื่อมต่อกับทั้ง C และ C ++ คุณต้องเรียกมันว่า C / C ++ แน่นอนว่าใครบางคนจะยกมือขึ้นและถามว่าทำไมคุณไม่เรียกสิ่งนี้ว่า C library ที่เกิดขึ้นกับ C ++ wrapper และ C ++ ก็สามารถลิงค์ไปยัง C library ได้ดังนั้นคุณไม่จำเป็นต้องพูดถึงมันเลย เพียงตอบ: "ใช่คุณพูดถูกนี่คือห้องสมุด C / C ++" นี่คือส่วน "การสื่อสารภายใน"

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

เป็นต้น

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

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

อย่ากลัวอนาคต ระบบปฏิบัติการของเราเขียนขึ้นใน C. ค่อนข้างมากการผลิตซอฟต์แวร์ปัจจุบัน C / C ++ เกิดขึ้นใน C ++ คู่นี้อยู่ที่นี่สักพัก ไม่มีใครมีความสนใจในการถูกทำให้เข้ากันไม่ได้กับอีกคนหนึ่ง (ค่อนข้างตรงข้ามจริง ๆ )

หากต้องการระบุคะแนนของคุณโดยเฉพาะ:

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

2) N / A

3) ฉันคิดว่าไม่ แต่ฉันไม่มีลูกบอลคริสตัล

4) ไม่มีความคิด

5) ฉันไม่คิดอย่างนั้นเนื่องจากไม่มีสิ่งใดผลักไปในทิศทางนี้


7
ความคิดเห็นถูกลบเมื่อพวกเขาเริ่มมีเสียงดัง
ChrisF

3
ทำไมถึงมี upvotes มากมาย? มันเต็มไปด้วยความไม่ถูกต้องและการเรียกร้องที่ผิดพลาด!
Zaibis

5
@Zaibis คุณจะใจดีพอที่จะขยายการเรียกร้องที่ผิดหรือไม่ถูกต้อง?
หมายเลขผู้ใช้

3
ตามตรรกะของคุณ C / C ++ / Objective-C / Fortran / Pascal ควรเป็นนิพจน์ที่ถูกต้อง แต่ฟังดูงี่เง่า ปัญหาเกี่ยวกับคำศัพท์ C / C ++ คือมันอาจหมายถึงหลายสิ่งหลายอย่างดังนั้นคุณจึงไม่รับประกันว่ามันจะได้รับความหมายที่ต้องการ ในการปฏิบัติของฉันคนมักจะเข้าใจว่า "C เป็นเพียงรุ่นดั้งเดิมดั้งเดิมของ C ++" และนี่เป็นสิ่งที่ผิด
martinkunev

4
นอกเหนือจากความถูกต้องที่แท้จริงของคำC/C++นั้นไม่ชัดเจนและไม่เป็นประโยชน์ ตามตัวอย่างของคุณ a C/C++ libraryอาจหมายถึงไลบรารี C ที่มีตัวห่อหุ้ม C ++ หรือไลบรารี C ++ ที่มีตัวห่อหุ้ม C หรืออาจหมายความว่าไลบรารีประกอบด้วยหลายโมดูลบางคอมไพล์โดยใช้ C ++ บางคอมไพล์ใน C นี่ไม่ชัดเจนเลย สำหรับฉันการบอกว่าการทำห้องสมุดมีC and C++ความชัดเจนมากขึ้นหรือC library with compatibility with C++ชัดเจนขึ้นอีกด้วย และที่นี่ความคลุมเครืออยู่เพียงสอง lang ลองนึกภาพโดยใช้ "กลยุทธ์การสื่อสาร" นี้เพื่อเพิ่มเติม ...
gaborous

43

ไปกับการไหลผมจะบอกว่ามันขึ้นอยู่กับบริบท

คำว่า "C / C ++" มักจะไม่เหมาะสมเมื่อพูดบางอย่างเช่น "นี่คือโปรแกรม C / C ++" แต่สิ่งนี้ได้รับการสำรวจในเชิงลึกในคำตอบอื่น ๆ

อย่างไรก็ตามอาจมีบริบทที่เหมาะสมกับ C / C ++

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

10
ฉันเห็นว่าตำแหน่งต่อต้านฉันทามติทั่วไปที่นี่ใน P.SO (ที่คุณต้อง upvote สิ่งที่มีลักษณะ "เปรียว / hype / เหมือนสิ่งหนึ่งและสิ่งที่ไม่ซ้ำขวา" และ downvote ส่วนที่เหลือ) ยินดีต้อนรับตามปกติ พวกการเขียนโปรแกรมไม่ใช่ศาสนาและเว็บไซต์นี้ไม่ใช่หนังสือศักดิ์สิทธิ์

16
สัญลักษณ์ล่าสุดจริงโชว์ผลงานเป็นปัญหาสำคัญ: คุณกำลังมองหา (1) สำหรับคนที่ knowns ทั้ง C หรือ C ++ (2) เป็นคนที่รู้ทั้ง C และ C ++ หรือ (3) เป็นบุคคลที่มีความสับสนที่จะได้ยินเสียงเหล่านี้มี ภาษาที่แตกต่างกัน. อย่าช่วยกลุ่มที่สามให้เติบโต
5gon12eder

10
สัญลักษณ์แสดงหัวข้อย่อยสุดท้ายจะดีกว่าแสดงเป็น "โปรแกรมเมอร์ที่มีประสบการณ์ใน C และ C ++" ถ้านั่นคือสิ่งที่คุณกำลังมองหา โฆษณาตำแหน่งงานที่ชื่อว่า "programmer" ซึ่งอยู่ภายใต้ประสบการณ์ที่จำเป็นต้องมีหัวข้อรายการ "C และ C ++" หรือ "C หรือ C ++" ไม่แตกต่างจาก "programmer" หนึ่งคนที่มีชื่อว่า "programmer" และรายการ "C / C ++" เป็นคุณสมบัติที่จำเป็นมากแน่นอนมากขึ้น ประเภทของบุคคลที่คุณกำลังมองหางานดังกล่าวอาจชื่นชมความแม่นยำในการแสดงออก
CVn

10
ในภาษาเขียนว่า '/' ก็มักจะตีความว่าเป็นตรรกะไม่เป็นตรรกะor xorดังนั้นจึงเป็นหนึ่งหรือทั้งสอง ในรายการงานที่คุณรู้ว่าทั้ง C หรือ C ++ หรือทั้งสองอย่าง ตอนนี้ฉันรู้สึกว่าผู้คนจำนวนมากกำลังเคร่งศาสนากับคำศัพท์ ดีโปรแกรมเมอร์ C จะสมบูรณ์ดียกขึ้น c ++ อิสระของวิธีการที่แตกต่างกันทั้งสองภาษา ฉันเริ่มเขียนโค้ด PHP และจากนั้นฉันย้ายไปที่ Scala (ภาษาที่แตกต่างกันสองภาษา) ทำไมโปรแกรมเมอร์ C ถึงไม่สามารถรับ C ++ หรือ viceversa ได้? คำศัพท์ C / C ++ มีข้อดีอยู่บ้างหากใช้ภายในบริบทที่ถูกต้อง
ILikeTacos

4
คุณสามารถใช้ C / C ++ เพื่ออธิบายโปรแกรมที่มีวัตถุประสงค์เพื่อทำงานเมื่อรวบรวมเป็น C หรือ C ++ หรือโปรแกรมที่มีส่วนประกอบ C และ C ++ แยกกัน
Immibis

30

โดยทั่วไปผู้ใช้ SO จะถามผู้ที่ถามคำถามเพื่อเลือกภาษา: C หรือ C ++ ทำไม?

มีความแตกต่างเล็กน้อยระหว่าง C และ C ++ ยกตัวอย่างเช่นใน C ++ เป็นconstตัวแปรในขอบเขตทั่วโลกมีการเชื่อมโยงภายในเว้นแต่ประกาศexternแต่ใน C staticก็มีการเชื่อมโยงภายนอกเว้นแต่ประกาศ ด้วยการพูดว่า "C / C ++" OP จะอ้างความรู้ว่าคำตอบสำหรับคำถามของพวกเขาเหมือนกันทั้งใน C และ C ++ เมื่อมันไม่ดี สิ่งนี้ไม่จำเป็นสำหรับผู้ตอบคำถาม

  • บางครั้งเราสามารถมองเห็นว่ารหัสไม่ถูกต้องในภาษาหนึ่งหรืออีกภาษาหนึ่ง (ตัวอย่างเช่นการแปลงโดยนัยจากvoid*ตัวชี้ไปยังตัวชี้วัตถุไม่ถูกต้องใน C ++) มันน่ารำคาญ ทำไมคุณถึงพูดว่า "C / C ++" เมื่อคุณมีรหัสที่ใช้ได้ใน C แต่ไม่ใช่ C ++ คุณตั้งใจ C หรือนี่เป็นเพียงข้อผิดพลาดในรหัสที่ตั้งใจจะเป็น C ++ ใช่หรือไม่

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

  • บางครั้งคำตอบนั้นเหมือนกันสำหรับทั้งสองภาษา แต่ก็ยากที่จะแน่ใจ ตัวอย่างเช่นฉันคิดว่า C และ C ++ มีกฎการแปลงเลขจำนวนเต็มเหมือนกัน แต่เพื่อให้เป็นจริงแน่นอนฉันต้องอ่านทั้งสองมาตรฐานอย่างระมัดระวัง อีกครั้งสิ่งนี้ทำให้ฉันทำงานได้มากเท่าที่จำเป็นเมื่อคุณอาจสนใจเพียงหนึ่งภาษา

อย่างไรก็ตามเพื่อตอบคำถามอื่น ๆ ของคุณ:

  1. ใช่.

  2. หากคุณเชื่อมโยงรหัส C และ C ++ เข้าด้วยกันคุณสามารถใช้ทั้งสองแท็กได้ แต่โปรดระบุภาษาที่แต่ละไฟล์ใช้

  3. บางครั้งมีการเปลี่ยนแปลงครั้งใหญ่ แต่สิ่งเหล่านี้หายากและมักมีข้อ จำกัด ในเรื่องของผลกระทบ ตัวอย่างเช่นautoใน C ++ 11

  4. ฉันไม่คิดว่าพวกเขาจะทำงานร่วมกันโดยตรง แต่พวกเขาให้ความสนใจกับการพัฒนาในภาษาอื่นและพยายามหลีกเลี่ยงการแนะนำการเปลี่ยนแปลงที่จะทำให้ความเข้ากันได้ยากขึ้น

และถ้าคุณอยากรู้เกี่ยวกับทั้งสองภาษานี้เป็นเรื่องปกติและคุณสามารถพูดได้ในคำถามของคุณ เมื่อคุณพูดว่า "C / C ++" ฉันไม่แน่ใจจริงๆว่าคุณหมายถึงอะไรและดูเหมือนว่าคุณกำลังตั้งสมมติฐานเกี่ยวกับสองภาษา


7
ฉันรู้ว่ามีคนที่เขียนโค้ดในจุดตัดของ C และ C ++ และใช้คอมไพเลอร์ C ++ สำหรับการพิมพ์ดีด แต่ C คอมไพเลอร์สำหรับการสร้างรหัส ฉันไม่รู้ว่าจริง ๆ แล้วมันสมเหตุสมผลหรือไม่ อย่างไรก็ตามมันเป็นหัวข้อที่เกิดขึ้นทุกสองสามปีในลิสต์ของลินุกซ์เคอร์เนลเมื่อมีคนส่งแพตช์เพื่อเปลี่ยนชื่อ (สำคัญมากใน Unified Object-Oriented Driver Model) ของลินุกซ์เคอร์เนลเป็นstruct classสิ่งที่ต้องการstruct klassด้วยเหตุผลนั้นและ จากนั้นได้รับการยิงอย่างสม่ำเสมอโดย Linus
Jörg W Mittag

3
@ JörgWMittag: ฉันไม่เคยพบใครที่ใช้ "C / C ++" เป็นคำย่อสำหรับ "ชุดย่อยทั่วไปของ C และ C ++" และยังรู้ว่าเขากำลังพูดถึงอะไร ผู้ที่ตั้งใจทำงานในชุดย่อยทั่วไปมักจะทำให้ชัดเจนโดยไม่ย่อ
Bart van Ingen Schenau

2
นี่เป็นคำตอบที่ดีโดยเฉพาะเกี่ยวกับการใช้ C / C ++ ในคำถาม Stack Exchangeไม่ใช่โดยทั่วไป
immibis

@BartvanIngenSchenau คุณพบสมาชิกคณะกรรมการมาตรฐานกี่คน?
curiousguy

18

ฉันมักจะบอกว่า C เป็นเซตย่อยของ C ++ หรือ C ++ คือ C พร้อมคลาส และนั่นก็เงียบจริงจนกระทั่งการปรากฏตัวของ C ++ x0, C ++ 11 (หรือ C ++ ที่ทันสมัยโดยทั่วไป 11/14/17)

C ไม่เคยเป็นส่วนย่อยของ C ++ ตัวอย่างเช่น C89 ไม่ใช่ชุดย่อยของ C ++ 98

ตัวอย่างบางส่วน:

  • แบบฟอร์มรายการตัวระบุ C89 สำหรับการประกาศพารามิเตอร์ฟังก์ชันไม่ได้รับการสนับสนุนใน C ++
  • C89 และ C ++ 98 มีประเภทที่แตกต่างกันสำหรับค่าคงที่ของอักขระ
  • C89 และ C ++ 98 มีชนิดของตัวอักษรสตริงที่แตกต่างกัน
  • ตัวดำเนินการเชิงตรรกะให้ผลต่างชนิดใน C89 และ C ++ 98 ( intvs bool)
  1. ฉันควรหยุดใช้คำว่า C / C ++ หรือไม่

ใช่.

  1. หากคำตอบของ # 1 คือใช่ฉันจะเรียกโปรแกรมที่ใช้ผสม C และ C ++ ได้อย่างไร

โปรแกรมคือ C หรือ C ++ (หากโปรแกรมพื้นฐานบางโปรแกรมสามารถคอมไพล์ด้วยคอมไพเลอร์ C หรือ C ++) คุณใช้คอมไพเลอร์ใดในการรวบรวม ควรตอบคำถามของคุณ Harbison & Steele ประกาศคำศัพท์Clean Cเพื่อกำหนดชุดย่อยทั่วไปของ C และ C ++ แต่ฉันคิดว่ามันเป็นความคิดที่ไม่ดี

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

  1. เนื่องจากทั้งสองภาษาเป็น 'ที่แตกต่างกัน' เป็นไปได้ว่าในบางจุดคอมไพเลอร์ C ++ จะหยุดการสนับสนุนโค้ดที่เขียนในภาษา C (เนื่องจาก c ++ สมัยใหม่แยกออกจากความคิด C สำหรับสิ่งพื้นฐานเช่นพอยน์เตอร์, การจัดการหน่วยความจำแบบไดนามิก ฯลฯ )

มีคุณสมบัติมากมาย (ตัวอย่างเช่น: อาร์เรย์ความยาวผันแปร, สมาชิกอาเรย์แบบยืดหยุ่น_Generic, ... ) ของ C99 หรือ C11 ที่ไม่รองรับเวอร์ชัน C ++


อีกหลายภาษาโปรแกรม: โปรแกรมที่ใช้ JNI อย่างกว้างขวางอาจเรียกว่าโปรแกรม C / Java ความจริงที่ว่ามีการใช้สองภาษาร่วมกันไม่ได้แปลว่ามันถูกรวบรวมเข้าด้วยกัน
immibis

1
stroustrup.com/bs_faq.html#C-is-subset "ในแง่คณิตศาสตร์ที่เข้มงวด C ไม่ใช่เซตย่อยของ C ++ ... อย่างไรก็ตาม C ++ สนับสนุนทุกเทคนิคการเขียนโปรแกรมที่สนับสนุนโดย C ... ไม่ใช่เรื่องแปลกที่จะเป็น สามารถแปลงบรรทัด C ถึง C-style C ++ เป็นหมื่น ๆ เส้นในเวลาไม่กี่ชั่วโมงดังนั้นC ++ จึงเป็น superset ของ ANSI C มากเท่ากับ ANSI C เป็น Superset ของ K&R C และ ISO C ++ เป็น superset ของ C ++ มาก ตามที่มีอยู่ในปี 1985 C ที่เขียนมาอย่างดีมีแนวโน้มที่จะถูกกฎหมายเช่นกันตัวอย่างเช่นทุกตัวอย่างใน Kernighan & Ritchie: "ภาษาการเขียนโปรแกรม C (รุ่นที่ 2)" เป็นโปรแกรม C ++ ด้วย "
Ben

@Ben โปรแกรมแรก (สวัสดีชาวโลก) ใน "ภาษาการเขียนโปรแกรม C (รุ่นที่ 2)" ละเว้นประเภทการส่งคืนของหลักซึ่งไม่ถูกต้องใน C ++
ouah

1
@ คุณดูเหมือนว่าศาสตราจารย์ Stroustrup พลาดไปแล้ว :-) โปรดทราบว่าไม่อนุญาตใน C11 เช่น :-) ค่อนข้างแน่ใจว่าได้รับอนุญาตใน C ++ รุ่นก่อนหน้า
Ben

4
@ ouah นั่นไม่ใช่รุ่นแรกของ C ++ หนังสือเล่มนี้มาจากปี 1988และในเวลานั้นไม่มีภาษาใดที่เป็นมาตรฐาน ISO รุ่นปัจจุบันของ C ++ ในขณะนั้นคือหนังสือ Bjarne Stroustrup ในปี 1985
Ben

17

บางโปรแกรมเขียนด้วย C และ C ++

นี่เป็นเพียงความจริงของชีวิต คุณสามารถรวบรวมไฟล์วัตถุจาก C และ C ++ และเชื่อมโยงเข้าด้วยกัน ผลลัพธ์สามารถเรียกได้ว่า "โปรแกรม C / C ++"

แต่นั่นเป็นเพียงโปรแกรมโดยรวม แล้วหน่วยการรวบรวมเดี่ยวล่ะ?

มีเซตย่อยของ C ซึ่งก็คือเซตย่อยของ C ++

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

โปรแกรมบางส่วนเช่นไฟล์ส่วนหัวอาจใช้ทั้งในโปรแกรม C และ C ++ ไฟล์ส่วนหัวดังกล่าวสามารถเรียกได้อย่างถูกต้องว่าเป็นส่วนหัว C / C ++

การอ้างถึงศาสตราจารย์ Bjarne Stroustrup:

C เป็นเซตย่อยของ C ++ หรือไม่

ในความหมายทางคณิตศาสตร์ที่เข้มงวด C ไม่ใช่เซตย่อยของ C ++ มีโปรแกรมที่ถูกต้อง C แต่ไม่ถูกต้อง C ++ และแม้กระทั่งวิธีการเขียนโค้ดที่มีความหมายแตกต่างกันใน C และ C ++ อย่างไรก็ตาม C ++ รองรับทุกเทคนิคการเขียนโปรแกรมที่สนับสนุนโดย C ทุกโปรแกรม C สามารถเขียนได้ในลักษณะเดียวกันใน C ++ ที่มีเวลาทำงานและประสิทธิภาพพื้นที่เท่ากัน ไม่ใช่เรื่องแปลกที่จะสามารถแปลงหมื่น ANSI C เป็น C-style C ++ ในเวลาไม่กี่ชั่วโมง ดังนั้น C ++ จึงเป็น superset ของ ANSI C มากที่สุดเท่าที่ ANSI C เป็น superset ของ K&R C และ ISO C ++ เป็น superset ของ C ++ มากเท่าที่มันมีอยู่ในปี 1985

C ที่เขียนมาอย่างดีมีแนวโน้มที่จะถูกกฎหมายด้วยเช่นกัน ตัวอย่างเช่นทุกตัวอย่างใน Kernighan & Ritchie: "ภาษาการเขียนโปรแกรม C (รุ่นที่ 2)" เป็นโปรแกรม C ++ เช่นกัน

ดังนั้นใช่มีสิ่งเช่น C / C ++ มันคือทุกอย่างที่ใช้ได้ทั้ง C และ C ++ ที่ถูกต้อง

ตัวประมวลผลล่วงหน้า C เป็นส่วนหนึ่งของภาษา C ตัวประมวลผลล่วงหน้า C ++ เป็นส่วนหนึ่งของภาษา C ++

คุณสามารถเขียนหน่วยการสะสมซึ่งจะรวบรวมใต้ C หรือ C ++ และมีความแตกต่างกัน ตัวอย่างเช่นมันอาจมีฟังก์ชั่นพื้นฐานที่คอมไพล์ใน C แต่ใช้ประโยชน์จากไลบรารี่ C ++ หากคอมไพล์ใน C ++

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

โปรแกรมเมอร์ C ส่วนใหญ่สามารถทำอย่างน้อย C ++ และในทางกลับกัน

ไม่มีเหตุผลที่จะเรียกโปรแกรมเมอร์ C / C ++ บุคคลดังกล่าว ใช่พวกเขาอาจจะมีความเชี่ยวชาญในหนึ่ง แต่มีใครที่เป็นผู้มีอำนาจ C หรือ C ++ โปรแกรมที่แท้จริงไม่สามารถทำใด ๆของภาษาอื่น ๆ ในทางหนึ่งโปรแกรมเมอร์ C / C ++ ทุกคนไม่ใช่เหรอ?

ไม่มีอะไรผิดปกติในการพูดว่า "C / C ++" สิ่งที่กำลังเข้าใจ

ภาษาอังกฤษไม่ได้เป็นเครื่องมือสำหรับการแสดง syllogisms คุณสามารถใช้ภาษาอังกฤษเป็นเหตุผล แต่เพียงและด้วยความพยายามอย่างมาก

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


5
@ BЈовићพวกเขาไม่เห็นด้วยกับคุณเกี่ยวกับการยอมรับคำศัพท์ชิ้นเล็ก ๆ ดังนั้นคุณจึงสรุปได้ว่าพวกเขาไม่เข้าใจความแตกต่างและไร้ความสามารถ นั่นเป็นสิ่งที่ไร้เหตุผลที่จะพูด
เบ็น

4
@ el.pescado ใช่ คุณจะพบว่าผู้คนในความเป็นจริงอ้างถึง PHP / JavaScript ทำไมจะไม่ล่ะ? ประเด็นคือต้องเข้าใจไม่ใช่เล่นเกมด้วยคำพูด
เบ็น

10
@ BЈовићคุณไม่มีเหตุผล พวกเขาไม่ได้ "แตกต่างอย่างสิ้นเชิง" C ++ เป็นภาษาที่มีขนาดใหญ่กว่า C มาก แต่มันรวม C เกือบทั้งหมดไว้ด้วย มีความเข้ากันไม่ได้ซึ่งทำให้ C ++ เป็นซุปเปอร์เซ็ตที่เหมาะสมแต่มีขนาดเล็กเช่นคำที่สงวนไว้เพิ่มเติมมีการปลดเปลื้องอีกสองสามครั้งเป็นสิ่งจำเป็น แต่นั่นก็ค่อนข้างมาก มันเกือบจะเป็นซุปเปอร์เซ็ตที่เหมาะสม
เบ็น

7
@ BЈовићบางทีคุณอาจไม่เข้าใจสิ่งที่ฉันเขียน ทำไมคุณไม่ดูที่นี่เพื่อดูว่าในทุกกรณีเป็นไปได้ที่จะปรับโปรแกรม C เพื่อให้คอมไพล์เป็น C ++ david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовићหากคุณเป็นคนที่กระตือรือร้นเกี่ยวกับคำศัพท์คุณควรทราบว่า C ไม่ใช่ " หน้าที่ " แต่เป็น " ขั้นตอน " - ความแตกต่างที่คุณอาจต้องการทำความเข้าใจก่อนที่คุณจะกล่าวหาคนอื่นว่าไม่มีความสามารถ
RM

15
  1. ฉันควรหยุดใช้คำว่า C / C ++ หรือไม่

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

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

ฉันขอแนะนำว่าแทนที่จะพูดถึง“ C / C ++” คุณใช้คำที่ทำให้ชัดเจนว่าคุณหมายถึงอะไร

  • หากคุณกำลังพูดคุยเกี่ยวกับบางสิ่งบางอย่างใน C ที่อาจจะหรืออาจจะยังไม่เป็นจริงสำหรับ C ++ เพียงแค่พูดC

    ตัวอย่าง: ควรmainประกาศฟังก์ชันใน C อย่างไร

    ตอนแรกมันอาจจะดูเหมือนว่าคำตอบสำหรับ C ++ เป็นเดียวกัน: หรือint main() int main(int, char**)แต่ในขณะที่การอภิปรายไปก็อาจจะมีความเกี่ยวข้องกับการชี้ให้เห็นว่าใน C ++, ฟังก์ชั่นจะต้องมีการประกาศในขอบเขตทั่วโลกซึ่งไม่ได้ทำให้ความรู้สึกใน C เพราะมันไม่มีnamespaces ในทางกลับกัน C อนุญาตให้โทรmainซ้ำในขณะที่ C ++ ไม่ได้ ใน C ++ จะมีความหมายโดยนัยreturn 0;ถ้าคุณ“ ตกลงมา” mainแต่ใน C returnจำเป็นต้องมีคำสั่งบนเส้นทางใด ๆ รายการจะดำเนินต่อไปและทำให้การสนทนาง่ายขึ้นหากคุณทำให้ชัดเจนว่าภาษาใดที่จะพูดถึง

  • หากคุณกำลังพูดคุยเกี่ยวกับบางสิ่งบางอย่างใน C ++ ที่อาจจะหรืออาจจะยังไม่เป็นจริงสำหรับ C, เพียงแค่พูดภาษา C ++

    ตัวอย่าง: จะmalloc()อาร์เรย์เอ็ดของints แรกเป็นค่าศูนย์ทั้งหมดใน C ++?

    คำตอบสั้น ๆ สำหรับ C เกิดขึ้นเหมือนกัน: ไม่ แต่เมื่อคำตอบดำเนินต่อไปมันอาจจะคุ้มค่าที่จะชี้ให้เห็นว่าใน C callocจะเป็นทางเลือกที่ดีใน C ++ การใช้ a std::vector<int>อาจเป็นทางเลือกที่ดีกว่าในตอนแรก

  • ถ้าคุณต้องการที่จะชี้ให้เห็นความคล้ายคลึงกันระหว่าง C และ C ++ ได้พูดC และ C

    ตัวอย่าง: ใน C และ C ++ ที่คือการดำเนินการกำหนดและอาจแตกต่างกันระหว่างคอมไพเลอร์และสถาปัตยกรรมsizeofint

    ที่นี่เราต้องการชี้ให้เห็นว่า C และ C ++ ทำงานในลักษณะเดียวกัน เรากำลังพูดถึงทั้งสองภาษาอย่างชัดเจน

ฉันขอแนะนำให้คุณเจาะจงมากยิ่งขึ้นและไม่เพียง แต่พูดถึง "C" หรือ "C ++" แต่เป็นรุ่นที่แม่นยำ ทั้งสองภาษากำลังพัฒนาและมีคำสั่งที่ไม่มีการเปิดเผยเช่น

C ++ รองรับ/* … */และ// …แสดงความคิดเห็นในขณะที่ C รองรับเฉพาะ/* … */สไตล์

ไม่ถูกหรือผิด

  1. หากคำตอบของ # 1 คือใช่ฉันจะเรียกโปรแกรมที่ใช้ผสม C และ C ++ ได้อย่างไร

เนื่องจากภาษามีการทับซ้อนกันทุกโปรแกรม C จะมีชิ้นส่วนที่อาจดูเหมือน C ++ และในทางกลับกัน อย่างไรก็ตามผู้เขียนอาจจะตัดสินโดยใช้คอมไพเลอร์ C หรือ C ++ ดังนั้นพูดว่า“ โปรแกรมเขียนด้วยC ” ถ้ามันถูกคอมไพล์ด้วยคอมไพเลอร์ C และ“ โปรแกรมนั้นเขียนในC ++ ” ถ้าพวกเขาใช้คอมไพเลอร์ C ++, ถึงแม้ว่าพวกเขาอาจปฏิเสธที่จะใช้คุณสมบัติ C ++ ที่ทันสมัย บางคนอ้างถึงรหัสเช่น C ++ เป็นแบบ C c กรณีที่ไม่มีการโอเวอร์โหลด, ข้อยกเว้น, ความหลากหลาย, แม่แบบและ I / O สตรีมลักษณะทั่วไปของรหัสดังกล่าว

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

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

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

  1. ระบุว่าทั้งสองภาษานั้น“ แตกต่าง” มีแนวโน้มว่าในบางจุดคอมไพเลอร์ C ++ หยุดสนับสนุนโค้ดที่เขียนในภาษา C (เนื่องจาก C ++ สมัยใหม่แยกออกจากความคิด C สำหรับสิ่งพื้นฐานเช่นพอยน์เตอร์การจัดการหน่วยความจำแบบไดนามิก ฯลฯ )?

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามนี้ เนื่องจาก C และ C ++ เป็นภาษาที่แตกต่างกันคุณจึงไม่สามารถคาดหวังคอมไพเลอร์สำหรับหนึ่งในนั้นจึงยอมรับโปรแกรมที่เขียนขึ้นสำหรับอีกภาษาหนึ่ง อย่างไรก็ตามคอมไพเลอร์ได้รับการออกแบบในลักษณะโมดูลาร์และหากคอมไพเลอร์มี C ++ front-endโอกาสที่ดีก็จะมี C front-end (จากนั้นคุณจะเลือกสิ่งที่พวกเขาต้องการผ่านสวิตช์บรรทัดคำสั่งหรือวิธีการที่คล้ายกัน) ตราบใดที่ทั้งสองภาษามีการใช้อย่างแพร่หลายดูเหมือนว่าไม่น่าเป็นไปได้มากว่าสิ่งนี้จะเปลี่ยนไป ประเด็นของคุณเกี่ยวกับ“ modern C ++” ฉันคิดว่าเป็นเรื่องของมาตรฐานการเข้ารหัสที่ดีและไลบรารีมาตรฐาน จากมุมมองของคอมไพเลอร์การวิวัฒนาการของทั้งสองภาษาค่อนข้างจะเป็นการบรรจบกันมากกว่าการเบี่ยงเบน

  1. ตอนนี้มีการร่วมมือกันระหว่างคนที่สร้างมาตรฐานของ C / C ++ เพื่อให้เข้ากันได้หรือไม่?

ใช่. โมเดลหน่วยความจำและไลบรารีปฏิบัติการอะตอมมิกใน C ++ 11 และ C11 เป็นตัวอย่างที่ดี ดูเหมือนว่านักออกแบบของทั้งสองภาษาตระหนักดีว่าความเข้ากันได้นั้นสำคัญและกำลังพยายามปรับปรุง โดยส่วนตัวแล้วฉันต้องการความร่วมมือที่เข้มข้นขึ้นและคณะทำงาน ISO สองกลุ่มอาจเข้าร่วมด้วย แต่ความปรารถนาของฉันไม่สำคัญ

Bjarne Stroustrup พูดถึงความแตกต่างและ commonalities ระหว่างรุ่นต่าง ๆ ของ C และ C ++ ใน§ 44.3 ของรุ่นที่ 4 ของการเขียนโปรแกรมภาษา C ++รุ่นที่ 4 ซึ่งมีความหมายว่า "ความเข้ากันได้ของ C / C ++" การใช้คำศัพท์อาจจะเหมาะสมในกรณีนี้เนื่องจากเป็นที่ชัดเจนว่ามีความหมายอะไร

  1. หาก # 4 คือใช่การทำงานร่วมกันดังกล่าวอาจสิ้นสุดลงในอนาคตอันใกล้นี้ด้วยรูปลักษณ์ของ C ++ ที่ทันสมัย ​​(11/14/17)

ดังที่กล่าวข้างต้นมันเกิดขึ้นใน C ++ 11 และคาดว่า / หวัง / จำเป็นต้องเกิดขึ้นอีกครั้ง


มันจะไม่ถูกหรือผิดอย่างไร
JDługosz

4
มันไม่มีคุณค่าความจริงที่ชัดเจนเช่นเดียวกับข้อความที่ว่า "สิ่งที่เป็นสีเขียวมีราคาแพง" สำหรับการรวมกันอย่างเฉพาะเจาะจงของเวอร์ชัน C และ C ++ มันเป็นจริงสำหรับคนอื่น ๆ มันเป็นเท็จ
5gon12eder

5

C / C ++ คือจุดตัดของ C และ C ++

int new;ไม่ได้เป็น C / C ++ vector<int> foo;และไม่เป็น

ในทำนองเดียวกัน C89 / C99 เป็นจุดตัดของสองภาษานี้ที่ไม่อนุญาตenum bool { false, true };หรือไม่for(int i = 0;;)อนุญาต

และ C ++ 11 / C ++ 14 เป็นต้น

เป็นไปได้ที่จะเขียนโค้ดที่คอมไพล์ (และรันอย่างถูกต้อง) ภายใต้ C ++ 11 และ C ++ 14 แม้ว่าการคอมไพล์ภายใต้อันใดอันหนึ่งไม่ได้แปลว่าคอมไพล์ภายใต้ตัวอื่น ในความเป็นจริงผู้คนจำนวนมากทำเช่นนี้

และผู้คนมากมายเขียนโค้ดที่ทำงานใน C และ C ++

เห็นได้ชัดว่ายิ่งทับซ้อนยิ่งรู้สึกมากขึ้น ฉันไม่คาดหวังที่จะเห็นคำถามใด ๆ เกี่ยวกับรหัส C / C ++ / Java


แม้ว่ามันจะ "สมเหตุสมผล" ที่จะพูดถึงชุดย่อยทั่วไปของภาษาเหล่านี้ แต่คำถามมากมายจะไม่มีคำตอบในชุดย่อยนี้เช่นmain () ควรส่งคืนใน C และ C ++ อย่างไร

แต่คุณสามารถพูดคุยเกี่ยวกับรหัสที่ใช้งานได้กับข้อกำหนดหลายภาษาไม่ว่าข้อกำหนดนั้นจะแตกต่างกันไปตาม "รุ่น" หรือ "ชื่อภาษา" หรืออย่างอื่น


3

นี่คือการตอบสนองต่อการเรียงลำดับไปยังตำแหน่งที่ "นี่คือรหัสสำหรับโปรแกรมเมอร์ที่ทำงานใกล้กับโลหะและเป็น OK ในบริบทการจัดการ" เห็นในคำตอบและความคิดเห็นอื่น ๆ


ฉันขอยืนยันว่าแม้การตีความนั้นจะต้องดำเนินการด้วยความระมัดระวัง

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

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

ฉันไม่ได้อยู่ในธุรกิจวันนี้ (แม้แต่ในระดับที่ฉันเคยเป็นเมื่อ Stack Overflow อยู่ในช่วงวัยเด็ก) ดังนั้นฉันจะไม่เดาว่าผู้ให้สัมภาษณ์ในจินตนาการมักจะไม่ได้มีทักษะการข้าม แต่ ฉันคิดว่าภาษาที่ใช้บ่อยที่สุดนั้นแตกต่างกันมากในขณะนี้

ในระยะสั้น "C / C ++" ควรจะลดลงไม่เพียง แต่ในบริบททางเทคนิค แต่ในบริบททางธุรกิจส่วนใหญ่เช่นกัน


วิธีที่ดีในการชี้ให้เห็นว่าความกำกวมว่ามันหมายถึง "ทั้ง C หรือ C ++, ใครจะรู้", "C และ C ++, เชื่อมโยงกัน", "C และ C ++, ทางแยก" หรือ "C หรือ C ++, ใครสนใจ" มีความชอบธรรมน้อยลงเรื่อย ๆ แม้จะอยู่ห่างไกลจากที่ใดก็ตาม
Deduplicator

2

คำตอบที่ง่ายที่สุดสำหรับคำถามนี้คือคุณไม่ควรใช้คำนั้น มันเป็นคำที่ไม่ควรมีอยู่ มันไม่มีความหมาย ทุกโปรแกรมคือ C หรือ C ++

และนั่นก็เงียบจริงจนกระทั่งการปรากฏตัวของ C ++ x0, C ++ 11 (หรือ C ++ ที่ทันสมัยโดยทั่วไป 11/14/17)

C ++ 98 และ 03 ยังไม่ได้ C จากระยะไกลด้วย Classes เช่นกัน ใครก็ตามที่สอนคุณสิ่งนี้จะไม่รู้จักใครและคุณสามารถลืมพวกเขาได้ สิ่งนี้ไม่ถูกต้อง


สิ่งนี้ไม่เป็นความจริงทั้งหมด มีอยู่ครั้งหนึ่งหน้าเว็บที่อธิบายรายละเอียดภาษาที่เสนอสำหรับภาษาที่เรียกว่า "C / C ++" ซึ่งเหนือสิ่งอื่นใดได้ระบุการขาด (ใกล้) ของระบบประเภท น่าเศร้าที่หน้าเว็บนั้นถูกลบและเว็บไซต์ที่โฮสต์นั้นมีการวาง robots.txt ซึ่งลบสำเนาที่เก็บถาวรออกจาก archive.org
greyfade

1
อ้าฉันได้พบสำเนาบน archive.is: เหตุผล , ไวยากรณ์และความหมาย
greyfade

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

ไม่ได้จริงๆ โปรแกรมนั้นประกอบด้วยโปรแกรมย่อยซึ่งแต่ละโปรแกรมเป็น C หรือ C ++ แต่ละ TU ซึ่งเป็นโปรแกรมทั้งหมดที่เกี่ยวข้องกับคอมไพเลอร์จะถูกคอมไพล์เป็น C หรือ C ++
DeadMG

3
ไม่ใช่กรณีที่ "ทุกโปรแกรมเป็น C หรือ C ++" ศาสตราจารย์ Bjarne Stroustrup พูดว่า: 'C ที่เขียนมาอย่างดีมีแนวโน้มที่จะเป็นภาษาซีพลัสพลัสเช่นกัน ตัวอย่างเช่นทุกตัวอย่างใน Kernighan & Ritchie: "ภาษาการเขียนโปรแกรม C (รุ่นที่ 2)" เป็นโปรแกรม C ++ เช่นกัน ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

โดยทั่วไปแล้วไม่ควรมีปัญหาในการออกแบบไฟล์ต้นฉบับ C ดังนั้นจึงสามารถคอมไพล์ได้เช่นเดียวกับ C ++ อาจมีข้อได้เปรียบที่สำคัญบางประการในการทำเช่นนี้ ตัวอย่างเช่นเมื่อเขียนโค้ดสำหรับระบบฝังตัวในบางครั้งการใช้รหัสในระบบ PC ที่โฮสต์จะเป็นประโยชน์ หากรหัสรวบรวมได้อย่างหมดจดเป็น C ++ เป็นไปได้ที่จะมีคำสั่งเช่น "MOTOR_ENABLE = 1;" เขียนไปยังบิต I / O ที่ลบเลือนบนระบบฝังตัว (คอมไพล์เป็น C) แต่เรียกใช้ตรรกะการจำลองบนพีซี (คอมไพล์เป็น C ++) นอกจากนี้ยังอาจเป็นไปได้ที่จะออกแบบชนิด C ++ บนพีซีซึ่งจะทำงานในลักษณะที่ uint16_t ทำงานในระบบฝังตัวที่มีขนาดเล็กลง (เช่นนั้นตัวอย่างเช่นu16 x=65533;คอมไพเลอร์จะต้องคำนึงถึงคุณค่าของx*xอายุเก้าขวบแทนที่จะเป็นอิสระที่จะทำทุกอย่างตามที่ต้องการ) แต่ถึงกระนั้นไม่มีผู้เอาอย่างของฉันรวมอยู่ด้วย [ส่วนหนึ่งเป็นเพราะคอมไพเลอร์ C ++ ที่ฉันเคยใช้ไม่ได้ทำอะไรแปลกประหลาดในกรณีเช่นนี้]

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

ในขณะที่จุดตัดของ C89 และ C ++ 98 เป็นภาษาที่ใช้การได้ แต่ superset ที่ใช้งานได้ของ C รุ่นที่ใหม่กว่าที่มี C ++ รุ่นต่อมาอาจหดตัวมากกว่าการเติบโต (ขอบคุณสิ่งต่าง ๆ เช่น Strict Aliasing Rule) และแนวโน้มนิยม รอยแยกที่เพิ่มขึ้น


1
"C ++ 95" คืออะไร รายงานทางเทคนิค?
Ben Voigt

1
หากคุณต้องการโอเวอร์โหลดสำหรับฟังก์ชั่นภายในของคุณ แต่ไม่มีชื่อ mangling สำหรับฟังก์ชั่นภายนอกของคุณคุณสามารถใส่อดีตลงในแบบไม่ระบุชื่อnamespaceและประกาศหลังเป็นextern "C"แล้วใช้คอมไพเลอร์ C ++
5gon12eder

@BenVoigt: Mea culpa ฉันควรจะเงยหน้าขึ้นมอง รุ่น C ++ ก่อน C99 เมื่อ C89 ออกมามันพยายามทำให้ C เป็นเหมือน C ++ มากขึ้น แต่ C99 ได้เพิ่มฟีเจอร์จำนวนมากที่ C ++ ไม่สนใจแน่นอน (เช่นอาร์เรย์ที่มีความยาวผันแปรได้) ฉันไม่ได้เขียนโปรแกรมใน C ++ มากนัก แต่ฉันคิดว่าคุณสมบัติ C ++ อีกสองสามอย่างจะช่วย C มากกว่าคุณสมบัติที่แตกต่างกันได้ช่วยแล้ว
supercat

@ 5gon12eder: ฉันไม่เคยพยายามที่จะเชื่อมโยงรหัส C ++ เข้ากับโครงการ C มันง่ายเหมือนการมีทุกอย่างไม่ว่าจะเป็นแบบคงที่ / แบบอินไลน์หรือextern "C"มีภาวะแทรกซ้อนอื่น ๆ เช่นกัน (เช่นการเริ่มต้นวัตถุคงที่ ฯลฯ )? มีวิธีใดบ้างใน C ++ ที่จะสร้างขึ้นมาเพื่อที่foo(1234)จะเรียกfoo_const(1234)มาโครในขณะที่foo(x)[ที่xไม่คงที่] จะเรียกใช้foo_var(x)ฟังก์ชันหรือไม่ มีหลายสถานการณ์ในรหัสที่ฝังตัวซึ่งมันอาจสมเหตุสมผลสำหรับ "ฟังก์ชั่น" เช่นSET_PORT(port, state)มีสามรูปแบบโดยพิจารณาว่าพอร์ตและสถานะเป็นทั้ง ...
supercat

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