views:

559

answers:

2

I added #ifndef..#define..#endif to a file of my project and the compiler fails. As soon as I remove it or put any other name in the define it compiles fine. What could be the problem?

Sounds like the file is already declared, but I do not know where. I'm fine just removing it, but I really want to know why this is happening.

error: expected class-name before ‘{’ token
error: ‘QDesignerFormEditorInterface’ has not been declared

And a couple of other errors.

I am actually using an example from Qt, "Custom Widget Plugin Example".

The difference is I am using my own class for the custom widget (.h, .cpp and .ui file).

It might have to do with the file that has 2 includes, though that is how the example did it.

+2  A: 

If you add an #ifndef for a constant that's already defined, it will always validate to true. You say "the file is declared", but files do not get declared. It is really the constant that you place after #ifndef that you should be checking. Do a simple search through the whole source tree and double-check in what order your current #define appears.

And of course: is your code correct? Try with a rubbish name as constant, and place #endif right after it: if it still errors, you have typos (paste your code, if so). See also this post.

PS: I see that David Thornley was typing similar advice in a comment... sorry if this duplicates info in this thread.

Abel
as I said, everything compiles fine when I put rubbish as the constant.
yan bellavance
then, sounds to me you should use rubbish indeed (the name really doesn't matter) as the name causing trouble is apparently declared elsewhere already. As mentioned in the other answer, the constant can be any name. If the scope is only local, then don't bother and keep your working rubbish-like name.
Abel
I was hoping to understand why this is so.
yan bellavance
Maybe I wasn't clear. Make sure to take a good look at Pate's answer, it's rather extensive. If `XYZ` is defined, and you have `#ifndef XYZ`, it will always fail. If you want the reverse, use a name that's not defined. That's all the *"why"* there is to it, I'm afraid.
Abel
ok I will look into it..sorry i am at work and didnt have much time today to look at it. Thx for your answers though
yan bellavance
+13  A: 
Roger Pate
#pragma once - the best include guard (if supported by your target compilers)
sbk
Except the #pragma introduces the debate about support and being non-standard, with no additional benefit. It's easy to use include guards.
Roger Pate
A potential additional benefit is that the compiler could build a collection of header file names that have had #pragma once used in them and never even open the file again rather than having to open the file, read it all, parse it and ignore it. That said I use both and have the #pragma once protected by a compiler version check ...
Len Holgate
The compiler can do that with include guards. GCC has done this for years, and I heard MSVC does now too. A significant problem is how to handle things like links (both symbolic and hard)--the #pragma fails, but include guards work.
Roger Pate