Hello. I have some complex statement-expressions that I am having trouble with and this seemed like the more technical mailing list. I have boiled them down to these small examples:
#1: #define copyof(str) ({ char buf[sizeof(str)]; strcpy(buf, str); buf; }) int main(int argc, char **argv) { printf("%s %s\n", copyof("hello"), copyof("world")); } That produces the output "hello world" when compiled with no optimization, but "hello hello" when compiled with -O or greater (but not with just the flags enabled by -O). It was my impression that a character array allocated on the stack was kind of like a value rather than a pointer (like char arrays are inside a struct), so it seems like the statement-expression should be returning a copy of the whole array rather than a copy of a pointer to its previous location on the stack. #2: #define copyof(str) ({ char buf[128]; strcpy(buf, str); buf; }) int main(int argc, char **argv) { printf("%s %s\n", copyof("hello"), copyof("world")); } That produces "hello hello" no matter what optimization is used. #3: struct copy { char buf[128]; }; #define copyof(str) ({ struct copy cp; strcpy(cp.buf, str); cp; }).buf int main(int argc, char **argv) { printf("%s %s\n", copyof("hello"), copyof("world")); } Memory fault. #4: struct copy { char buf[128]; }; #define copyof(str) ({ struct copy cp; strcpy(cp.buf, str); cp; }).buf int main(int argc, char **argv) { printf("%s %s\n", copyof("hello"), copyof("world")); } That 'correctly' produces "hello world" with any optimization level. So my question is, are those all the expected behavior (#1 through #3 are not valid)? From my 'ok' knowledge of C and gnu extensions it seems like all four should produce "hello world". These results are from 4.1.2 and 4.2.3 on Gentoo, processor is Pentium M. Includes for stdio, string not shown.