- Czy powinienem przestać używać terminu C / C ++?
Absolutnie. Nie jest jasne, co ten konstrukt ma wyrazić, z wyjątkiem być może niejasności co do C i C ++ w imieniu osoby, która używa tego terminu.
Ponieważ to zamieszanie jest tak powszechnym źródłem frustracji, wiele osób zaczęło się tym bardzo przejmować, a samo pojawienie się tego terminu będzie wystarczającym powodem do negatywnego wpływu na wasz wkład. To może wydawać się głupie, ale wydaje się, że to, co mamy.
Zalecam, aby zamiast mówić o „C / C ++” używać terminu, który faktycznie wyjaśnia, co masz na myśli.
Jeśli mówimy o czymś w C, które mogą lub nie mogą być prawdziwe dla C ++, wystarczy powiedzieć C .
Przykład: Jak należy main
zadeklarować funkcję w C?
Na początku może się wydawać, że odpowiedź dla C ++ jest taka sama: int main()
lub int main(int, char**)
. Ale w trakcie dyskusji warto zauważyć, że w C ++ funkcja musi być zadeklarowana w zakresie globalnym, co nie ma sensu w C, ponieważ nie ma namespace
s. Z drugiej strony C pozwala na main
rekurencyjne wywoływanie, podczas gdy C ++ nie. W C ++ istnieje domniemanie, return 0;
jeśli „spadniesz”, main
ale w C return
instrukcja jest wymagana na dowolnej ścieżce. Lista jest długa i sprawia, że dyskusja jest znacznie prostsza, jeśli wyraźnie wyjaśnisz, jaki język ma być omawiany.
Jeśli mówisz o czymś w C ++, co może, ale nie musi być prawdą dla C, po prostu powiedz C ++ .
Przykład: czy malloc()
edytowana tablica int
s będzie początkowo zerami w C ++?
Krótka odpowiedź dla C jest taka sama: nie. Ale w miarę upływu odpowiedzi warto zwrócić uwagę, że w C calloc
byłaby dobrą alternatywą, podczas gdy w C ++, użycie std::vector<int>
może być lepszym wyborem.
Jeśli chcesz wskazać podobieństwo między C i C ++, powiedz C i C ++ .
Przykład: w C i C ++ implementacja sizeof
an int
jest zdefiniowana i może różnić się w zależności od kompilatora i architektury.
W tym miejscu chcemy podkreślić, że C i C ++ zachowują się w ten sam sposób. Mówimy wyraźnie o obu językach.
Naprawdę zalecam, abyś był bardziej szczegółowy i nie mówił tylko o „C” lub „C ++”, ale o dokładnej wersji. Oba języki ewoluują, a tępe stwierdzenie, takie jak
C ++ obsługuje /* … */
i // …
komentarze, podczas gdy C obsługuje tylko /* … */
styl.
nie jest ani dobre, ani złe.
- Jeśli odpowiedź na pytanie nr 1 brzmi „tak”, jak miałbym wywołać program wykorzystujący mieszankę C i C ++?
Ponieważ języki się nakładają, każdy program w C będzie zawierał części, które mogą wyglądać jak C ++ i odwrotnie. Niemniej jednak autorzy prawdopodobnie zdecydują się na użycie kompilatora C lub C ++. Powiedzmy więc, że „program jest napisany w C ”, jeśli jest skompilowany z kompilatorem C, a „program jest napisany w C ++ ”, jeśli używają kompilatora C ++, nawet jeśli mogą odmówić użycia jakichkolwiek nowoczesnych funkcji C ++. Niektórzy ludzie odnoszą się do takiego kodu C ++ jako C-stylu C ++ . Brak przeładowania, wyjątki, polimorfizm, szablony i strumienie we / wy to wspólne cechy takiego kodu.
Jeżeli natomiast niektóre pliki są zapisywane w C i skompilowany z kompilatora C i niektóre inne pliki są napisane w języku C ++ i skompilowany z kompilatora C ++, a następnie pliki obiektów połączonych ze sobą, chciałbym powiedzieć, że „program jest napisany w mix C i C ++ ”, tak jak już to zrobiłeś.
Jeśli jednak autorzy dołożyli wszelkich starań, aby napisać każdy plik w taki sposób, aby można go było skompilować za pomocą kompilatora C lub C ++, a wynikowy program zrobiłby to samo, można powiedzieć, że „program jest napisany we wspólnym podzbiorze C i C ++ ”.
To drugie często dotyczy plików nagłówkowych, które powinny być współużytkowane przez kod C i C ++. Nawiasem mówiąc, pisanie takiego kodu nie jest łatwe. Jeśli chcesz dodatkowo podkreślić, że użyto tylko takich konstrukcji, które są poprawne w C i C ++ i są szeroko obsługiwane przez różnych dostawców kompilatorów, można użyć terminu przenośny wspólny podzbiór C i C ++ .
- Biorąc pod uwagę, że oba są „różnymi” językami, czy jest prawdopodobne, że w pewnym momencie kompilatory C ++ przestaną obsługiwać kod napisany w języku C (ponieważ współczesne C ++ odbiega od mentalności C dla podstawowych rzeczy, takich jak wskaźniki, obsługa pamięci dynamicznej itp.)?
Nie jestem pewien, czy rozumiem to pytanie. Ponieważ C i C ++ są różnymi językami, nie można oczekiwać, że kompilator dla jednego z nich zaakceptuje program napisany dla drugiego. Jednak kompilatory są często projektowane w sposób modułowy i jeśli kompilator ma interfejs C ++ , są duże szanse, że będzie miał również interfejs C. (Następnie wybierasz, który z nich chcesz za pomocą przełącznika wiersza polecenia lub podobnych środków.) Tak długo, jak oba języki będą w powszechnym użyciu, wydaje się bardzo mało prawdopodobne, że to się zmieni. Twój punkt widzenia na temat „nowoczesnego C ++” myślę, że jest to w zasadzie kwestia dobrych standardów kodowania i standardowej biblioteki. Z punktu widzenia kompilatora ewolucja obu języków jest raczej zbieżna niż rozbieżna.
- Czy istnieje obecnie jakaś współpraca między ludźmi, którzy tworzą standardy C / C ++ w celu zachowania zgodności?
Tak. Model pamięci i biblioteka operacji atomowych wprowadzone w C ++ 11 i C11 są dobrym przykładem. Wygląda na to, że projektanci obu języków zdają sobie sprawę, że kompatybilność jest ważna i pracują nad jej ulepszeniem. Osobiście chciałbym, aby współpraca była bardziej intensywna, a dwie grupy robocze ISO mogły nawet dołączyć, ale moje życzenia nie są ważne.
Bjarne Stroustrup mówi o różnicach i podobieństwach między różnymi wersjami C i C ++ w § 44.3 czwartej edycji języka programowania C ++, który, jak na ironię, zatytułowany jest „Kompatybilność C / C ++”. W tym przypadku użycie tego terminu może być właściwe, ponieważ jest jasne, o co chodzi.
- Jeśli nr 4 brzmi „tak”, taka współpraca może zakończyć się w niedalekiej przyszłości pojawieniem się nowoczesnego C ++ (11/14/17)
Jak omówiono powyżej, wydarzyło się to w C ++ 11 i oczekuje się / ma nadzieję / powinno się powtórzyć.