2013-09-05 66 views
5

Niedawno zbadane w C11 i wiele nowych funkcji sprawia, że ​​łatwiej mi kod w C. Zastanawiam się, że WSZYSTKIE funkcje są oficjalnie wspierane przez C++ 11. Obawiam się, że nie chodzi o problemy z implementacją lub kompilatorem, ale o nowy standard C++.Czy C++ 11 obsługuje nowe funkcje C11?

+0

Niektóre, ale są to dwa osobne języki. – chris

+0

Jakie funkcje, w szczególności? Niektóre nowe funkcje C to także funkcje w C++ (ale nie ma gwarancji, ponieważ @chris mówi, że są to niezależne języki). –

+1

Jestem zaznajomiony z C++ 11, ale nie z C11: pomoże to wiedzieć, co konkretnie szukasz dla. Istnieją również obszary, w których oba języki realizują różne podejścia i funkcje nie będą mapowane z C na C++. –

Odpowiedz

5

Nie, C++ 11 nie obsługuje WSZYSTKICH funkcji C11. Nie obsługuje nawet wszystkich funkcji C99. Tablice o zmiennej długości, na przykład, zostały wprowadzone w C99, ale C++ jeszcze ich nie obsługuje. Aby uzyskać szczegółowe informacje, patrz this question.

+0

Tablice o zmiennej długości są przeznaczone dla C++ 14 (tylko po to, aby podać czas do wyciągu). – zneak

+0

@zneak: Nie, "tablice związane z runtime" rozpatrywane dla C++ nie są tym samym co VLA C. –

+0

@BenVoigt, [N3820] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3820.html#dcl.array) zawiera przykładowy formularz 'int foo [ n] 'o niestałym' n'. Jakie różnice powinienem znać? Widzę jednak, że nie jest on już przeznaczony dla C++ 14. – zneak

1

Standard C++ 11 odwołuje się do standardu C99, w szczególności do standardowej biblioteki C.

C++ 11 obsługuje niektóre, ale nie wszystkie, funkcje, które są w C99, ale nie w C90. (Niektóre funkcje specyficzne dla C99 są obsługiwane w inny sposób w C++ lub nie zostały uznane za odpowiednie).

C11 dodał szereg funkcji nad C99; większość z tych nowych funkcji została dodana do C++ w postaci , a nie.

Jednym z godnych uwagi wyjątków jest obsługa wątków (<threads.h> w C11, <thread> w C++ 11). Nie przyjrzałem się temu wystarczająco dokładnie, aby wiedzieć, jak są podobne.

(C11 wykonane również niektóre z jego nowych funkcji, a także niektórych funkcji C99, opcjonalnie;., Że nie jest również odzwierciedlenie w C++)

+2

Rozumiem, że C11 dodaje obsługę wątków, zarówno w formie obsługi języków, jak i komponentów używanych do obsługi wątków i prymitywów synchronizacji. Myślę, że wszystkie te funkcje są w C++, chociaż specyfikacje niekoniecznie są identyczne między C i C++. –

+0

Było też wiele innych drobiazgów, takich jak anonimowe struktury, brak funkcji zwracania, niektóre wyrażenia rodzajowe i tym podobne. I, co najważniejsze, w końcu pozbył się 'gets()'. –

+0

C11 dodał obsługę wątku C++ 11 (i atomów) bardziej niż odwrotnie;) –

2

Wśród głównych dodatków, dwa są wymieniane między C11 i C + +11: wątki i atomics. Myślę, że nowy model sekwencjonowania pamięci jest dzielony między tymi dwoma, ale nie znam C++ 11 na tyle, aby to potwierdzić z całą pewnością.

Jedno z głównych dodatków do C11 prawdopodobnie nigdy nie zostało udostępnione przez C++: wpisz ogólne wyrażenia z _Generic. Dla wielu przypadków użycia tego, w szczególności przeciążania funkcji, istnieją już konstrukty C++, które implementują to. Inne, bardziej rozbudowane przypadki użycia, takie jak wykrywanie stałych stałych wyrażeń całkowitoliczbowych, nie są objęte C++. C++ 1 ma constexpr, ale inne niż nazwa może sugerować, że nie jest to narzędzie do określenia, czy wyrażenie jest wyrażeniem stałym, ale do określenia, że ​​obiekt lub funkcja zwracana jest stała. Generowanie zupełnie innego kodu dla dwóch przypadków (stałego i niestałego) nie wydaje się możliwe.

Nie tylko to, że _Generic nie jest potrzebne w głównych przypadkach użycia w C++, ale w dużym stopniu opiera się na programowaniu makr w fazie wstępnej. Ponieważ makra są niezadowolone z powodu dużej części społeczności C++, która z pewnością nie znajdzie konsensusu.

+0

odrzucono. C++ 11 może wykrywać stałe wyrażenia w czasie kompilacji za pomocą 'constexpr'. – TemplateRex

+0

@TemplateRex, przyjrzę się temu, w jaki sposób porównuje się do funkcji C. Zgubienie się za taką rzeczą, nie dając mi czasu na poprawki, wydaje się nieco ekstremalne. Czy przypadkiem nie gonisz mnie w ostatnim dniu i nie zgodzisz się na kilka starych odpowiedzi, które dałem przed laty? –

+0

Nie, staram się zawsze dodawać komentarze, a ja zazwyczaj sprawdzam, czy jest aktualizacja odpowiedzi, aby móc wycofać jakiekolwiek spadki. Jeśli chodzi o inne komentarze, myślę, że wczoraj wieczorem zdarzyło się, że kilka osób zdenerwowało czat w salonie C++ w związku z edytowaniem tagów w [to pytanie] (http://stackoverflow.com/q/19120326/819272), w którym dwie górne odpowiedzi (w tym jeden z moich) również zostały odrzucone w tym samym czasie (* bez * komentarza). – TemplateRex