Pytanie Co uniemożliwia C ++ bycie ścisłym nadzorem C? [duplikować]


Możliwe duplikaty:
"C podzbiór C ++" -> Gdzie nie? przykłady? 

Jestem świadomy, że C ++ nie jest ścisłym nadzbiorem C. Jakie funkcje językowe uniemożliwiają C ++ bycie nadzbiorem C?


20
2017-09-23 09:36


pochodzenie


Na to pytanie odpowiedziało 1000 razy, chciałbym zobaczyć odpowiedź techniczną, która pokazuje, że po prostu nie jest możliwe, słowa kluczowe i C99 na bok ... - Matt Joiner
@Matt Joiner: dlaczego odłożyć C99 na bok? - JeremyP
@Matt: pokaż to co nie jest możliwe? Oczywiście każdy program C może być refaktoryzowany do poprawnego C ++. To dość trywialne, biorąc pod uwagę, że oba języki są kompletne. - Konrad Rudolph
@Konrad: To prawie takie banalne, ale nie całkiem. C jest Turing kompletny, a także zapewnia dostęp do systemu plików. Jego model obliczeniowy ma wyjścia, które nie są takie same jak wyjścia modelu Turinga. Hipotetyczny język, który był Turing kompletny, ale nie zapewniał dostępu do systemu plików, nie byłby nadzbiorem C w sensie "może być refaktoryzowany". Ale ponieważ C ++ zapewnia dostęp do wszystkich bibliotek C i do volatile pamięć, dobrze wyglądamy na wyniku we / wy. - Steve Jessop


Odpowiedzi:


Słoń w pokoju: poniższe jest poprawne C, ale nie prawidłowe C ++.

int typename = 1;

Zastąp swoje ulubione słowo zastrzeżone C ++.


41
2017-09-23 09:38



Dlaczego zostało to odrzucone? - Konrad Rudolph
Najkrótszy przykład byłby int new = 1; - SheetJS


C ++ również nie obsługuje tablic o zmiennej długości, gdzie:

int array[n];

jest poprawny w C, ale nie w C ++. Wersja powyższa w C ++ byłaby:

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

20
2017-09-23 09:40



Możesz to wyjaśnić n jest zmienną, a nie stałą, w przeciwnym razie byłaby prawdziwa w C ++. - Andreas Magnusson
Chciałbym wymienić new int[] i delete[] z std::vector<int>. - fredoverflow
Czy możesz wyjaśnić, dlaczego jest to możliwe w C? By array być przydzielone na stosie w jakiś sposób, a jeśli tak n były za duże na to? Wcale nie znam C, a ciekawi mnie, co się tam właściwie dzieje. - davidtbernal
@notJim: tak, array zostaną przydzielone na stosie. Gdyby n były na to zbyt duże, jeśli masz szczęście, kończy się implementacja z powodu sygnału (lub innej sankcji sterowanej przez system operacyjny). Jeśli nie masz szczęścia, implementacja ślepo prowadzi do niszczenia cudzej pamięci. Zależy od systemu operacyjnego / kompilatora. - Steve Jessop
@FredOverflow: Tak, to idiomatyczne C ++. - Andreas Magnusson


Jest specjalny wiki wpis, który podsumowuje wiele problemów.


11
2017-09-23 09:53





Prosty przykład, rozważ tę deklarację:

int f();

To jest poprawne C, ale nieprawidłowe C ++: f(3, 2, -5, "wtf");

Objaśnienie: w C, int f() jest traktowany jak int f(...) (przynajmniej w pierwszej witrynie połączenia). Zadeklaruj jako int f(void) jeśli nie chcesz f do podjęcia parametrów.


7
2017-09-23 09:47



Nie, int f() tak naprawdę nie jest int f(...) istnieje duża różnica semantyczna. W pierwszym przypadku oznacza to, że nie znam parametrów tej funkcji i przy pierwszym wywołaniu funkcji, domyślne typy używane jako parametry deklarują sygnaturę tej funkcji, kolejne wywołania muszą być zgodne z tym niejawnym prototypem i kompilator powinien ostrzegać, jeśli wywołasz funkcję z innymi parametrami. W przypadku elipsy tak nie jest, każde połączenie może mieć różne parametry bez ostrzeżenia. - Patrick Schlüter
@tristopia: Cokolwiek to jest, to naprawdę nie rób tego rzecz. - Alexandre C.
Absolutnie, po prostu nacieram, ponieważ istnieje prawdziwa, ale subtelna różnica. Powiedziałem, że nie obniżyłem twojego wkładu, ponieważ wiadomość jest głównie w porządku. - Patrick Schlüter


Jeden od początku mojej głowy - C ++ nie obsługuje domyślnego int.


2
2017-09-23 09:37



Niejawny zwrotny typ nie jest dozwolony w C, oprócz przed C99. - Antti Haapala