Программирование. Принципы и практика использования C++ Исправленное издание, стр. 390
int x;/* в файле y.c: */int x;Ни компилятор языка С, ни компилятор языка С++ не найдет никаких ошибок в файлах
x.cy.cx.cy.cx.cy.cxx.cy.cx/* в файле x.c: */int x = 0; /* определение *//* в файле y.c: */extern int x; /* объявление, но не определение */Впрочем, лучше используйте заголовочный файл.
/* в файле x.h: */extern int x; /* объявление, но не определение *//* в файле x.c: */#include "x.h"int x = 0; /* определение *//* в файле y.c: */#include "x.h"/* объявление переменной x находится в заголовочном файле */А еще лучше: избегайте глобальных переменных.
27.3.4. Приведение типов в стиле языка С
В языке C (и в языке C++) можете явно привести переменную
vT(T)v
vTint* p = (int*)7; /* интерпретирует битовую комбинацию: reinterpret_cast<int*>(7) */int x = (int)7.5; /* усекает переменную типа: static_cast<int>(7.5) */typedef struct S1 { /* ... */ } S1;typedef struct S2 { /* ... */ } S2;S1 a;const S2 b; /* в языке С допускаются неинициализированные /* константы */S1* p = (S2*)&a; /* интерпретирует битовую комбинацию: reinterpret_cast<S1*>(&a) */S2* q = (S2*)&b; /* отбрасывает спецификатор const: const_cast<S2*>(&b) */S1* r = (S1*)&b; /* удаляет спецификатор const и изменяет тип; похоже на ошибку */Мы не рекомендуем использовать макросы даже в программах на языке C (раздел 27.8), но, возможно, описанные выше идеи можно было бы выразить следующим образом:
#define REINTERPRET_CAST(T,v) ((T)(v))#define CONST_CAST(T,v) ((T)(v))S1* p = REINTERPRET_CAST (S1*,&a);S2* q = CONST_CAST(S2*,&b);Это не обеспечит проверку типов при выполнении операторов
reinterpret_castconst_cast27.3.5. Преобразование указателей типа void*
В языке указатель типа
void*void* alloc(size_t x); /* выделяет x байтов */void f (int n){ int* p = alloc(n*sizeof(int)); /* OK в языке C; ошибка в языке C++ */ /* ... */}Здесь указатель типа
void*alloc()int*int* p = (int*)alloc(n*sizeof(int)); /* OK и в языке C, и в языке C++ */Мы использовали приведение в стиле языка C (раздел 27.3.4), чтобы оно оказалось допустимым как в программах на языке C, так и в программах на языке C++.
void*T*