Программирование. Принципы и практика использования C++ Исправленное издание, стр. 389
struct pair { int x,y; };pair p1; /* ошибка: идентификатора pair не в области /* видимости */struct pair p2; /* OK */int pair = 7; /* OK: дескриптора структуры pair нет в области /* видимости */struct pair p3; /* OK: дескриптор структуры pair не маскируется /* типом int*/pair = 8; /* OK: идентификатор pair ссылается на число типа /* int */Довольно интересно, что, применив обходной маневр, этот прием можно заставить работать и в языке С++. Присваивание переменным (и функциям) тех же имен, что и структурам, — весьма распространенный трюк, используемый в программах на языке С, хотя мы его не рекомендуем.
structtypedeftypedef struct { int x,y; } pair;pair p1 = { 1, 2 };В общем, оператор
typedef
struct S { struct T { /* ... */ }; / * ... */};struct T x; /* OK в языке C (но не в C++) */В программе на языке C++ этот фрагмент следовало бы написать так:
S::T x; // OK в языке C++ (но не в C)При малейшей возможности не используйте вложенные структуры в программах на языке C: их правила разрешения области видимости отличаются от наивных (и вполне разумных) предположений большинства людей.
27.3.2. Ключевые слова
Многие ключевые слова в языке C++ не являются ключевыми словами в языке С (поскольку язык С не обеспечивает соответствующие функциональные возможности) и поэтому могут использоваться как идентификаторы в программах на языке C.

Некоторые ключевые слова в языке C++ являются макросами в языке C.

В языке C они определены в заголовочных файлах
<iso646.h><stdbool.h>booltruefalse27.3.3. Определения
Язык C++ допускает определения в большем количестве мест программы по сравнению с языком C. Рассмотрим пример.
for (int i = 0; i<max; ++i) x[i] = y[i]; // определение переменной i, // недопустимое в языке Cwhile (struct S* p = next(q)) { // определение указателя p, // недопустимое в языке C /* ... */}void f(int i){ if (i< 0 || max<=i) error("Ошибка диапазона"); int a[max]; // ошибка: объявление после инструкции // в языке С не разрешено /* ... */}Язык C (C89) не допускает объявлений в разделе инициализации счетчика цикла
forint i;for (i = 0; i<max; ++i) x[i] = y[i];struct S* p;while (p = next(q)) { /* ... */}void f(int i){ if (i< 0 || max<=i) error("Ошибка диапазона"); { int a[max]; /* ... */ }}В языке С++ неинициализированное объявление считается определением; в языке С оно считается простым объявлением, поэтому его можно дублировать.
int x;int x; /* определяет или объявляет одну целочисленную переменную с именем x в программе на языке C; ошибка в языке C++ */
int/* в файле x.c: */