C structs are record types, but, while the standard does guarantees an in-memory ordering, in the general case you can't really iterate through members and always have to access by tag, so it might as well be unordered.
Also in C++:
struct A { int x; int y; } a;
struct B { int y; int x; } b;
template<class C> concept has_x_y = requires(C c) {
{ c.x } -> std::convertible_to<int>;
{ c.y } -> std::convertible_to<int>;
};
int sum(has_x_y auto z) { return z.x + z.y; }
...
sum(a);
sum(b);
Also in C++: