On Fri, Jun 10, 2005 at 01:28:13PM +0300, Giorgos Keramidas wrote: > On 2005-06-10 12:46, Ruslan Ermilov <ru_at_freebsd.org> wrote: > >On Fri, Jun 10, 2005 at 11:16:27AM +0200, Stefan Farfeleder wrote: > >>On Fri, Jun 10, 2005 at 11:06:16AM +0200, Dag-Erling Sm?rgrav wrote: > >>>Joseph Koshy <joseph.koshy_at_gmail.com> writes: > >>>> Dag-Erling Sm?rgrav <des_at_des.no> writes: > >>>> > It also seems strange to me that you on the one hand introduce a > >>>> > new struct to separate MD and MI interfaces, and on the other hand > >>>> > continue to assume that they are assignment-compatible. > >>>> I'd be very surprised if two C structures with identical definitions > >>>> were not assignment compatible. > >>> > >>> I wouldn't be surprised if the standard says they aren't. > >>> Unfortunately, my copy is at home. > >> > >> Do you mean the following? > >> > >> struct t1 { int a; } x; > >> struct t2 { int a; } y = { 42 }; > >> x = y; > >> > >> The types `struct t1' and `struct t2' are not compatible and thus not > >> assignable. See 6.2.7 and 6.5.16.1. > > > > If you're to byte-copy say t1 to t2, is it guaranteed to work? That > > is, do both types are guaranteed to have the same size and alignment > > of their structure members? I'm pretty sure this is guaranteed, as > > lot of code assumes this, for example, the sockaddr* structures. > > That would be very hard to guarantee if two different modules that use > the types are compiled with different alignment options, right? > > /* header1.h */ > struct t1 {short t1s; int t1a;}; > > /* header2.h */ > struct t2 {short t2s; int t2a;}; > > /* module1.c */ > #include "header1.h" > struct t1 x; > > /* module2.c */ > #include "header1.h" > #include "header2.h" > extern struct t1 x; > struct t2 y; > > If the two modules are compiled with different options that may affect > struct member alignment, how would one ensure that it is correct to > use code like this in module.c? > > y.t2s = 10; > y.t2a = 100; > memcpy(&x, &y, sizeof(x)); > > Even the use of sizeof(x) is tricky here, since there is no guarantee > that sizeof(x) < sizeof(y). > And if both modules use the same t1 but compiled with different alignment options, the memcpy() in module.c won't work either, even a simple assignment could break. :-) Cheers, -- Ruslan Ermilov ru_at_FreeBSD.org FreeBSD committer
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:36 UTC