Программирование. Принципы и практика использования C++ Исправленное издание, стр. 401
struct Name { struct Link lnk; /* структура Link нужна для выполнения ее операций */ char* p; /* строка имен */};До сих пор все было хорошо, хотя остается загадкой, как мы можем использовать этот член
LinkListLinkNamestruct Name* make_name(char* n){ struct Name* p = (struct Name*)malloc(sizeof(struct Name)); p–>p = n; return p;}Эту ситуацию можно проиллюстрировать следующим образом:

Попробуем использовать эти структуры.
int main(){ int count = 0; struct List names; /* создает список */ struct List* curr; init(&names); /* создаем несколько объектов Names и добавляем их в список: */ push_back(&names,(struct Link*)make_name("Norah")); push_back(&names,(struct Link*)make_name("Annemarie")); push_back(&names,(struct Link*)make_name("Kris")); /* удаляем второе имя (с индексом 1): */ erase(&names,advance(names.first,1)); curr = names.first; /* выписываем все имена */ for (; curr!=0; curr=curr–>suc) { count++; printf("element %d: %s\n", count, ((struct Name*)curr)–>p); }}Итак, мы смошенничали. Мы использовали приведение типа, чтобы работать с указателем типа
Name*Link*LinkNameОчевидно, что этот пример можно также скомпилировать с помощью компилятора языка С++.
ПОПРОБУЙТЕ
Программисты, работающие на языке C++, разговаривая с программистами, работающими на языке C, рефреном повторяют: “Все, что делаешь ты, я могу сделать лучше!” Итак, перепишите пример интрузивного контейнера
ListЗадание
1. Напишите программу “Hello World!” на языке C, скомпилируйте ее и выполните.
2. Определите две переменные, хранящие строки “Hello” и “World!” соответственно; конкатенируйте их с пробелом между ними и выведите в виде строки
Hello World!3. Определите функцию на языке C, получающую параметр
pchar*xintp is "foo" and x is 7Контрольные вопросы
В следующих вопросах предполагается выполнение стандарта ISO C89.
1. Является ли язык C++ подмножеством языка C?
2. Кто изобрел язык C?
3. Назовите высокоавторитетный учебник по языку С.
4. В какой организации были изобретены языки C и C++?
5. Почему язык С++ (почти) совместим с языком C?
6. Почему язык C++ только почти совместим с языком C?
7. Перечислите десять особенностей языка C++, отсутствующих в языке C.
8. Какой организации “принадлежат” языки C и C++?
9. Перечислите шесть компонентов стандартной библиотеки языка C++, которые не используются в языке C.
10. Какие компоненты стандартной библиотеки языка C можно использовать в языке C++?
11. Как обеспечить проверку типов аргументов функций в языке C?
12. Какие свойства языка C++, связанные с функциями, отсутствуют в языке C? Назовите по крайней мере три из них. Приведите примеры.
13. Как вызвать функцию, написанную на языке C, в программе, написанной на языке C++?
14. Как вызвать функцию, написанную на языке C++, в программе, написанной на языке C?
15. Какие типы совместимы в языках C и C++? Приведите примеры.
16. Что такое дескриптор структуры?
17. Перечислите двадцать ключевых слов языка C++, которые не являются ключевыми словами языка C.
18. Является ли инструкция
int x19. В чем заключается приведение в стиле языка С и чем оно опасно?
20. Что собой представляет тип
void*21. Чем отличаются перечисления в языках C и C++?
22. Что надо сделать в программе на языке C, чтобы избежать проблем, связанных с совпадением широко распространенных имен?
23. Назовите три наиболее широко используемые функции для работы со свободной памятью в языке C.
24. Как выглядит определение в стиле языка С?
25. Чем отличаются оператор
==strcmp()26. Как скопировать С-строки?
27. Как определить длину С-строки?
28. Как скопировать большой массив целых чисел типа
int29. Назовите преимущества и недостатки функции
printf()30. Почему никогда не следует использовать функцию
gets()31. Как открыть файл для чтения в программе на языке C?
32. В чем заключается разница между константами (
const33. Почему мы не любим макросы?
34. Как обычно используются макросы?