It can compile on my Ubuntu: DISTRIB_ID=Ubuntu DISTRIB_RELEASE=11.10 DISTRIB_CODENAME=oneiric DISTRIB_DESCRIPTION="Ubuntu 11.10"
gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 While "gcc -E", it gets the same output as RHEL's, but it can compile. I do not know why was that. :( 在 2011年12月20日 下午8:08,Stefan Hajnoczi <stefa...@gmail.com>写道: > On Tue, Dec 20, 2011 at 10:47 AM, Dong Xu Wang > <wdon...@linux.vnet.ibm.com> wrote: > > 于 2011年12月20日 18:13, Stefan Hajnoczi 写道: > > > >> On Tue, Dec 20, 2011 at 05:03:47PM +0800, Dong Xu Wang wrote: > >>> > >>> From: Dong Xu Wang<wdon...@linux.vnet.ibm.com> > >>> > >>> On some platforms, __LINE__ will not expand to real number in > >>> QEMU_BUILD_BUG_ON, > >>> so if using QEMU_BUILD_BUG_ON twice, compiler will report errors. This > >>> patch will > >>> fix it. > >>> > >>> BTW, I got error message on RHEL 6.1/gcc 4.4.5. > >> > >> > >> Can you post the gcc -E output of the file that produces the error as > >> well as the gcc error output? > >> > >> Stefan > >> > >> > > > > I doubled the following lines in block/qcow2-snapshot.c(line 211 and > 212): > > > > QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) != > > offsetof(QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots));" > > > > > > While "gcc -E -C -I. block/qcow2-snapshot.c", I can get: > > typedef char > > qemu_build_bug_on____LINE__ > > # 241 "block/qcow2-snapshot.c" > > [(__builtin_offsetof (QCowHeader, snapshots_offset) != > __builtin_offsetof > > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1]; > > > > ; > > typedef char > > qemu_build_bug_on____LINE__ > > # 243 "block/qcow2-snapshot.c" > > [(__builtin_offsetof (QCowHeader, snapshots_offset) != > __builtin_offsetof > > (QCowHeader, nb_snapshots) + sizeof(header_data.nb_snapshots))?-1:1]; > > > > __LINE__ are not expanded to real line number. > > > > > > > > While normally compiling, error message is: > > CC block/qcow2-snapshot.o > > block/qcow2-snapshot.c: In function \u2018qcow2_write_snapshots\u2019: > > block/qcow2-snapshot.c:244: error: redefinition of typedef > > \u2018qemu_build_bug_on____LINE__\u2019 > > block/qcow2-snapshot.c:242: note: previous declaration of > > \u2018qemu_build_bug_on____LINE__\u2019 was here > > make: *** [block/qcow2-snapshot.o] Error 1 > > Reviewed-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> > > This isn't a compiler-specific issue, it has never worked but we > didn't realize it. I suggest removing "On some platforms," from the > patch description. The preprocessor won't expand __LINE__ since there > is a ## and it is inside the QEMU_BUILD_BUG_ON_MACRO(): > > > http://stackoverflow.com/questions/1597007/creating-c-macro-with-and-line-token-concatenation-with-positioning-macr > > Stefan > >