I've just started using Eclipse Indigo (coming from Galileo) and I'm getting little red bugs in the gutter for every use of size_t.
The code compiles without issue but I suspect I have to explicitly add a path to the include directories. I already have the usual suspects in there. I am cross compiling for a ColdFire processor using the Gnu tool chain so in addition to the standard include from mfg of the chip I have the includes under m68k-elf
\include
\include\c++\4.2.1
\include\c++\4.2.1\include
\include\c++\4.2.1\m68k-elf
Update
I noticed that the only place stddef.h exists for this toolchain is in a lib
directory
gcc-m68k\lib\gcc\m68k-elf\4.2.1\include
I added that path, the parent path and \include-fixed
from the parent but the problem still exists.
Note on testing
When testing what works and what doesn't I noticed a couple of things
- Code analysis does not get re-triggered when modifying Code Analysis preference settings, I still need to make an editor change (simply adding a space works)
- Turning off the Code analysis setting for
Symbol is not resolved
will not make the error go away. - Turning off all
Syntax and Semantic Errors
, triggering the analysis, going back in and turning them all back on and then turning offSymbol is not resolved
keeps the error from reappearing.
After hitting this problem and a search revealing two stack overflow questions hitting the same problem, I figured I would submit how I fixed it after it annoyed me enough to actually investigate.
I'm running Fedora and annoyingly, it has a stddef.h file in /usr/include/linux.... which is actually empty. So even though I had the compiler's stddef.h in the include path, the indexer was actually parsing this other empty file. So what needed done was:
Prefix your paths and symbols list with the compiler specific include path (in my case it was /usr/lib/gcc/x86_64-redhat-linux/4.7.2/include/) to avoid the other empty stddef.h from being parsed.
Check your indexer settings under Preferences -> C/C++ -> Indexer.
There is a field there called "Filed to index up-front". Its contents should be:
If there is something else in there, try replacing it with the above, then rebuild the index, and see if that fixes the problem.
(In particular, if what you have in that field is
stdarg.h, stddef.h, sys/types.h
, then I have a pretty good guess as to what went wrong. Back in Eclipse Ganymede, the value of this field wasstdarg.h, stddef.h, sys/types.h
. In newer versions (Galileo and Indigo), it was changed to the above. However, since this field is part of "preferences", if you exported your Ganymede preferences and imported them into Galileo/Indigo, this field was overwritten with the old Ganymede value. I was burned by this a while ago.)I actually had the same problem. The issue seemed to be the same like the one described in the post of fquinner, the stddef.h located in
/usr/include/linux/stddef.h
was empty as well. Strangely enough, the correctstddef.h
was found by eclipse and even could be openened without any issues.If you just need to fix the indexing by eclipse like me (for example when building with another build tool anyway), this indexing issue can be worked around by defining
__SIZE_TYPE__
to the expected type, e.g.long unsigned int
underC/C++ General -> Paths and Symbols
.If your toolchain can compile the code with only its default include paths and symbols, just setting Eclipse to use them should be enough. Go to
C/C++ Build -> Discovery Options
in the project properties, and for each language, change theCompiler invocation command
from the native compiler (e.g.g++
) to your cross compiler (e.g.C:\nburn\gcc-m68k\bin\g++
perhaps?). Then on the next build, the auto-discovery will run and update the so-called "built-in" paths and symbols that show up in the project'sC/C++ General -> Paths and Symbols
to whatever your compiler reported, and you can re-index again to make sure any warnings for the old "built-ins" are gone.To make sure to get
size_t
you should#include
the header<cstddef>
; then, it would bestd::size_t
, unless you also put ausing namespace std
or ausing std::size_t
.