#include <stdio.h>
// эти структуры заводят внутри компилятора новые типы, которые не совместимы с
// другими типами, а главное - друг с другом
struct meters {
int meter;
};
struct centimeters {
int centimeter;
};
// это плохая функция, потому что в ней нет никакой информации о типах, и очень
// сложно сказать есть ли в ней какая-нибудь ошибка
// конечно, в реальности она будет принимать int m, int cm, но это всё равно
// довольно сложно заметить
int add_distances_bad( int a, int b ) {
return a + b;
}
struct centimeters add_distances_good( struct meters a, struct centimeters b ) {
// return a + b; // вот это просто не скомпилируется, потому что со
// структурами так делать нельзя
// это всё ещё неправильно, но такой код написать сложнее, и если он-таки
// написан, то при прочтении легко заметить, что что-то тут не так, ибо
// метры складываются с сантиметрами
//получается эдакий гибрид фантомных типов с венгерской нотацией, которая
// кое-как проверяется компилятором
return (struct centimeters) { a.meter + b.centimeter };
}
struct meters mk_meters( int a ) {
return (struct meters){ a };
}
struct centimeters mk_centimeters( int a ) {
return (struct centimeters){ a };
}
/*
Сами структуры исчезнут после компиляции, даже если оптимизация выключена.
С -О3 от них не останется и следа.
Потому что "механически" они полностью эквивалентны обычному инту.
*/
int main(void) {
struct meters m = mk_meters( 10 );
struct centimeters cm = mk_centimeters( 55 );
struct centimeters result1 = add_distances_good( m, cm );
int result2 = add_distances_bad( 10, 55 );
printf( "distances are %d and %d\n", result1.
centimeter, result2
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyDRjdGC0Lgg0YHRgtGA0YPQutGC0YPRgNGLINC30LDQstC+0LTRj9GCINCy0L3Rg9GC0YDQuCDQutC+0LzQv9C40LvRj9GC0L7RgNCwINC90L7QstGL0LUg0YLQuNC/0YssINC60L7RgtC+0YDRi9C1INC90LUg0YHQvtCy0LzQtdGB0YLQuNC80Ysg0YEgCi8vINC00YDRg9Cz0LjQvNC4INGC0LjQv9Cw0LzQuCwg0LAg0LPQu9Cw0LLQvdC+0LUgLSDQtNGA0YPQsyDRgSDQtNGA0YPQs9C+0LwKc3RydWN0IG1ldGVycyB7CglpbnQgbWV0ZXI7Cn07CgpzdHJ1Y3QgY2VudGltZXRlcnMgewoJaW50IGNlbnRpbWV0ZXI7Cn07CgovLyDRjdGC0L4g0L/Qu9C+0YXQsNGPINGE0YPQvdC60YbQuNGPLCDQv9C+0YLQvtC80YMg0YfRgtC+INCyINC90LXQuSDQvdC10YIg0L3QuNC60LDQutC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40Lgg0L4g0YLQuNC/0LDRhSwg0Lgg0L7Rh9C10L3RjCAKLy8g0YHQu9C+0LbQvdC+INGB0LrQsNC30LDRgtGMINC10YHRgtGMINC70Lgg0LIg0L3QtdC5INC60LDQutCw0Y8t0L3QuNCx0YPQtNGMINC+0YjQuNCx0LrQsAovLyDQutC+0L3QtdGH0L3Qviwg0LIg0YDQtdCw0LvRjNC90L7RgdGC0Lgg0L7QvdCwINCx0YPQtNC10YIg0L/RgNC40L3QuNC80LDRgtGMIGludCBtLCBpbnQgY20sINC90L4g0Y3RgtC+INCy0YHRkSDRgNCw0LLQvdC+IAovLyDQtNC+0LLQvtC70YzQvdC+INGB0LvQvtC20L3QviDQt9Cw0LzQtdGC0LjRgtGMCmludCBhZGRfZGlzdGFuY2VzX2JhZCggaW50IGEsIGludCBiICkgewoJcmV0dXJuIGEgKyBiOwp9CgpzdHJ1Y3QgY2VudGltZXRlcnMgYWRkX2Rpc3RhbmNlc19nb29kKCBzdHJ1Y3QgbWV0ZXJzIGEsIHN0cnVjdCBjZW50aW1ldGVycyBiICkgewoJLy8gcmV0dXJuIGEgKyBiOyAvLyDQstC+0YIg0Y3RgtC+INC/0YDQvtGB0YLQviDQvdC1INGB0LrQvtC80L/QuNC70LjRgNGD0LXRgtGB0Y8sINC/0L7RgtC+0LzRgyDRh9GC0L4g0YHQvgoJLy8g0YHRgtGA0YPQutGC0YPRgNCw0LzQuCDRgtCw0Log0LTQtdC70LDRgtGMINC90LXQu9GM0LfRjwoJCgkvLyDRjdGC0L4g0LLRgdGRINC10YnRkSDQvdC10L/RgNCw0LLQuNC70YzQvdC+LCDQvdC+INGC0LDQutC+0Lkg0LrQvtC0INC90LDQv9C40YHQsNGC0Ywg0YHQu9C+0LbQvdC10LUsINC4INC10YHQu9C4INC+0L0t0YLQsNC60LgKCS8vINC90LDQv9C40YHQsNC9LCDRgtC+INC/0YDQuCDQv9GA0L7Rh9GC0LXQvdC40Lgg0LvQtdCz0LrQviDQt9Cw0LzQtdGC0LjRgtGMLCDRh9GC0L4g0YfRgtC+LdGC0L4g0YLRg9GCINC90LUg0YLQsNC6LCDQuNCx0L4gCgkvLyDQvNC10YLRgNGLINGB0LrQu9Cw0LTRi9Cy0LDRjtGC0YHRjyDRgSDRgdCw0L3RgtC40LzQtdGC0YDQsNC80LgKCS8v0L/QvtC70YPRh9Cw0LXRgtGB0Y8g0Y3QtNCw0LrQuNC5INCz0LjQsdGA0LjQtCDRhNCw0L3RgtC+0LzQvdGL0YUg0YLQuNC/0L7QsiDRgSDQstC10L3Qs9C10YDRgdC60L7QuSDQvdC+0YLQsNGG0LjQtdC5LCDQutC+0YLQvtGA0LDRjwoJLy8g0LrQvtC1LdC60LDQuiDQv9GA0L7QstC10YDRj9C10YLRgdGPINC60L7QvNC/0LjQu9GP0YLQvtGA0L7QvAoJcmV0dXJuIChzdHJ1Y3QgY2VudGltZXRlcnMpIHsgYS5tZXRlciArIGIuY2VudGltZXRlciB9Owp9CgpzdHJ1Y3QgbWV0ZXJzIG1rX21ldGVycyggaW50IGEgKSB7CglyZXR1cm4gKHN0cnVjdCBtZXRlcnMpeyBhIH07Cn0KCnN0cnVjdCBjZW50aW1ldGVycyBta19jZW50aW1ldGVycyggaW50IGEgKSB7CglyZXR1cm4gKHN0cnVjdCBjZW50aW1ldGVycyl7IGEgfTsKfQovKgoJ0KHQsNC80Lgg0YHRgtGA0YPQutGC0YPRgNGLINC40YHRh9C10LfQvdGD0YIg0L/QvtGB0LvQtSDQutC+0LzQv9C40LvRj9GG0LjQuCwg0LTQsNC20LUg0LXRgdC70Lgg0L7Qv9GC0LjQvNC40LfQsNGG0LjRjyDQstGL0LrQu9GO0YfQtdC90LAuIAoJ0KEgLdCeMyDQvtGCINC90LjRhSDQvdC1INC+0YHRgtCw0L3QtdGC0YHRjyDQuCDRgdC70LXQtNCwLgoJ0J/QvtGC0L7QvNGDINGH0YLQviAi0LzQtdGF0LDQvdC40YfQtdGB0LrQuCIg0L7QvdC4INC/0L7Qu9C90L7RgdGC0YzRjiDRjdC60LLQuNCy0LDQu9C10L3RgtC90Ysg0L7QsdGL0YfQvdC+0LzRgyDQuNC90YLRgy4KKi8KaW50IG1haW4odm9pZCkgewoJc3RydWN0IG1ldGVycyBtID0gbWtfbWV0ZXJzKCAxMCApOwoJc3RydWN0IGNlbnRpbWV0ZXJzIGNtID0gbWtfY2VudGltZXRlcnMoIDU1ICk7CglzdHJ1Y3QgY2VudGltZXRlcnMgcmVzdWx0MSA9IGFkZF9kaXN0YW5jZXNfZ29vZCggbSwgY20gKTsKCWludCByZXN1bHQyID0gYWRkX2Rpc3RhbmNlc19iYWQoIDEwLCA1NSApOwoJcHJpbnRmKCAiZGlzdGFuY2VzIGFyZSAlZCBhbmQgJWRcbiIsIHJlc3VsdDEuY2VudGltZXRlciwgcmVzdWx0MiApOwoJcmV0dXJuIDA7Cn0K