2010-09-23 16 views
18

thể trùng lặp:
“C subset of C++” -> Where not ? examples ?Điều gì ngăn cản C++ trở thành một siêu sao của C?

Tôi biết rằng C++ không phải là một siêu nghiêm ngặt của C. Ngôn ngữ nào tính năng ngăn chặn C++ từ một superset của C?

+0

Câu hỏi này đã được trả lời 1000 lần, tôi muốn xem câu trả lời kỹ thuật cho thấy đơn giản là không thể, từ khóa và C99 sang một bên ... –

+1

@Matt Joiner: tại sao lại bỏ C99 sang một bên? – JeremyP

+1

@Matt: chứng minh rằng * những gì * là không thể? Tất nhiên mọi chương trình C có thể được cấu trúc lại thành C++ hợp lệ. Đó là khá tầm thường, cho rằng cả hai ngôn ngữ được Turing hoàn thành. –

Trả lời

39

Con voi trong phòng: sau đây là hợp lệ C nhưng không hợp lệ C++.

int typename = 1; 

Thay thế từ dành riêng cho C++ yêu thích của bạn.

+5

Tại sao điều này lại bị giảm giá? –

+4

Ví dụ ngắn nhất sẽ là 'int new = 1;' – SheetJS

2

Một từ đầu tôi - C++ không hỗ trợ int mặc định.

+0

Loại trả về tiềm ẩn không được phép trong C, ngoại trừ trước C99. –

19

C++ cũng không hỗ trợ mảng chiều dài thay đổi, trong đó:

int array[n]; 

là hợp lệ trong C, nhưng không phải C++. A ++ phiên bản C của các bên trên sẽ là:

int *array = new int[n]; 
    ... 
delete [] array; 
+0

Bạn có thể muốn làm rõ rằng 'n' là một biến, không phải là hằng số, nếu không nó sẽ thực sự hợp lệ trong C++. –

+2

Tôi sẽ thay thế 'new int []' và 'delete []' bằng 'std :: vector '. – fredoverflow

+0

Bạn có thể giải thích lý do tại sao bạn có thể làm việc đầu tiên trong C? Sẽ 'mảng' được phân bổ trên ngăn xếp bằng cách nào đó, và những gì nếu' n' là quá lớn cho điều đó? Tôi không biết gì về C, và tôi tò mò chính xác những gì đang xảy ra ở đó. – notJim

7

đơn giản ví dụ, hãy xem xét tuyên bố này:

int f(); 

này có giá trị C, nhưng không hợp lệ C++: f(3, 2, -5, "wtf");

Giải thích: trong C, int f() được xử lý như int f(...) (ít nhất là tại trang web cuộc gọi đầu tiên). Khai báo là int f(void) nếu bạn không muốn f để nhận tham số.

+4

Không, 'int f()' không thực sự là 'int f (...)', có một sự khác biệt lớn về ngữ nghĩa. Trong trường hợp đầu tiên, điều này có nghĩa là tôi không biết các tham số của hàm đó và tại lần gặp đầu tiên của cuộc gọi hàm, các kiểu mặc định được sử dụng làm tham số khai báo chữ ký của hàm đó, các cuộc gọi tiếp theo phải tuân theo nguyên mẫu ngầm và trình biên dịch nên cảnh báo nếu bạn gọi hàm với các tham số khác. Với hình elip nó không phải là trường hợp, mỗi cuộc gọi có thể có các thông số khác nhau mà không cần cảnh báo. –

+0

@tristopia: Dù nó là gì, nó thực sự là một * không làm điều này *. –

+0

Tuyệt đối, tôi đã chỉ là nitpicking như có một sự khác biệt thực sự nhưng tinh tế. Điều này nói rằng tôi đã không downvoted đóng góp của bạn như là thông điệp chủ yếu là ok. –

11

Có mục nhập đặc biệt wiki tóm tắt rất nhiều vấn đề.

Các vấn đề liên quan