This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ PATCH] warning about empty extern "C" structures
Roman Kononov <kononov195-far@yahoo.com> writes:
| On 05/17/2006 11:12, Gabriel Dos Reis wrote:
| > | They prevent from introducing safe C++ code.
| > I don't understand that comment.
|
| Look at this:
| ------------------------
| header.h:
|
| extern "C" {
| struct spinlock_t {};
| struct device_t
| {
| struct spinlock_t spinlock;
| char flags;
| };
| void do_something(device_t* device);
| } //extern "C"
| ------------------------
| driver.c:
|
| #include <header.h>
|
| void do_something(device_t* device)
| {
| if (device->flags) do1();
| else do2();
| }
| ------------------------
| user.cpp:
|
| #include <header.h>
|
| void user()
| {
| device_t device;
| device.flags=0x55;
| do_something(&device); //run-time crash
| }
| ------------------------
| Header.h and driver.c are old GCC code using all possible GCC
| extensions. User.cpp is an attempt for C++ to co-exist in the Linux
| kernel. To make driver.c and user.cpp, linked together, to work as
| they should, one needs to do something with extern "C" struct
| spinlock_t {};.
warning will not prevent the program from crashing...
| Currently, there is no compiler help for the user
| compiling his user.cpp file to know about such misbehavior.
even -pedantic or -std=c89?
Notice that the issue is not just at the g++ side. It is also on the
gcc side.
-- Gaby