For the C/C++ geeks out there, here's a grumpymaking thing I stumbled upon today.
In a .h file:
And therefore, in my .c file:
I know there are ways around this, potentially involving (say) precompiled headers, but this is supposedly a simple proof-of-concept app so I'm not bothering for now. And seriously. Who would release something like that and not get fired? Never mind; I know the answer.
In a .h file:
void __inline FUNCTION_NAME(mystruct* foo)
{
foo->addrValid = TRUE;
}And therefore, in my .c file:
// HORRIBLE HACK! Only one .o in an executable can have StupidInclude.h included. // It defines inline functions and the link step will fail if multiple .o files // contain those definitions. But every .o in this type of executable must have the // app data structure definition... which, for this app, relies on StupidInclude.h. // Therefore, there can be only one .o in this executable. #include "echoer.c" #include "listener.c" #include "pinger.c"
I know there are ways around this, potentially involving (say) precompiled headers, but this is supposedly a simple proof-of-concept app so I'm not bothering for now. And seriously. Who would release something like that and not get fired? Never mind; I know the answer.
no subject
I think your compiler is on the list of things being idiots. It shouldn't be defining symbols in the .o files for the inline functions, and this ought to work right.
Of course, it's possible that I'm completely off-base here. Or that the problem is that the __inline syntax doesn't do what it's supposed to do because of being the wrong thing for this particular compiler.
no subject
I should mention that almost every developer using this .h file will also be using the compiler I'm using. (For the system I'm trying to work with, there are only two compilers that will work at all, and the other one costs over $1000.) The guys who wrote that .h obviously didn't try it out with multiple object files.
no subject
If that's true, there are compiler flags to use the "other" behavior which may be relevant. It is also possible that a "#define __inline SOMETHING" hack before including the relevant header files will make things work.
Oh, wait a minute. Right. I decided to check and see how we handle this in our libraries, and realized that this is a stupidity on the part of those library developers -- for this to work right, that function needs to be declared static as well as __inline. A rough hunch is that "#define __inline static __inline" will do the right thing, though that's an ugly hack that breaks if __inline is already a preprocessor macro. (Then you'd need "#define old_inline __inline; #undef __inline; #define __inline static old_inline" or somesuch atrocity.)
IMO, if you've got any kind of support at all for this library, I'd send them a "WTF?" email. :)
no subject
I'm using gcc, yep. Got it in one. :-)
no subject
In C99, "inline" means, roughly, the same thing as "static inline". However, GCC still defaults to using the pre-C99 meaning, where it's only a compiler hint with no actual semantic meaning (and so externally-visible symbols should still get emitted).
Passing the -std=gnu99 option to GCC, if you're using a sufficiently recent version, should do the trick (though it may cause other problems).
(I will note that this is all predicated on GCC treating "inline" and "__inline" as identical, which I think is the case, but I'm not absolutely certain of it.)
no subject
It would be spectacularly awful if "-std=gnu99" were incompatible with this system. I wouldn't put it past 'em. But I haven't tried it yet. Other things ate my afternoon. :)
no subject
no subject
no subject
The GNU/C99/C++ handling of non-static "inline" or "extern inline" is a confusing enough situation that I always stick with "static inline" these days and don't think about it too hard.... If you get stuck using another compiler in addition to GCC, things may get annoying (like, the Sun compiler will always put a static copy of the function in the object file, even if you don't use it), but it should still work.
So, "#define __inline static __inline__", "#include <stupid.h>", "#undef __inline" in case you include a system header later that might try using __inline more reasonably.
no subject
I'd'a thunk with probably over ninety percent of their developers on GCC, they'd have clued in. But obviously I'd'a thunk wrong. :-)
no subject
static inline int64_t atomic64_add(atomic64 *a, int64_t b) { int64_t i; i = b; __asm__ __volatile__( LOCKPREFIX "xaddq %0, %1" : "+r" (b), "+m" (a->value) : : "memory"); return (b + i); }no subject
Brooks notes above that this is a GCC holdover from the days when __inline hadn't been standardized. Still, since GCC is by far the major compiler in use for this code, I wish the library vendor had TRIED it.
no subject
static inline void FUNCTION_NAME();
Now just make sure that you include static_override.h before you include the broken one.