I made a new Arduino IDE project ABC
, and am given ABC.ino
. Then I create a XYZ.h
and XYZ.cpp
.
ABC.ino
:
#include "XYZ.h"
void setup() {}
void loop() {}
XYZ.h
:
#ifndef XYZ
#define XYZ
#include "Arduino.h"
class XYZ { };
#endif
XYZ.cpp
:
#include "Arduino.h"
#include "XYZ.h"
When I try to compile this, I get some error:
In file included from sketch/XYZ.cpp:2:0:
XYZ:8: error: abstract declarator '<anonymous class>' used as declaration
};
^
exit status 1
abstract declarator '<anonymous class>' used as declaration
However, when I rename my class to something other than the file name, like XYZa
, the compilation succeeds.
Why can't I have the same name class as the file?
I've done C++ projects (independent of Arduino) via Xcode
and nano
, and this has never been a problem.
-
INCLUDE THE FULL CODE!!!Dat Ha– Dat Ha2016年12月02日 21:34:35 +00:00Commented Dec 2, 2016 at 21:34
-
@DatHa -- This is the full code. It's extremely boilerplate. :)Fine Man– Fine Man2016年12月02日 21:35:11 +00:00Commented Dec 2, 2016 at 21:35
2 Answers 2
#define XYZ
...
class XYZ { };
After preprocessing, what do you think that ends up as?
-
IDK. But, if you're suggesting that it's because it's an empty class, I think I've ruled it out. If you add
void QRS()
to.h
andvoid XYZ::QRS() {}
to.cpp
I still get that error AND another one.Fine Man– Fine Man2016年12月02日 21:40:47 +00:00Commented Dec 2, 2016 at 21:40 -
Do you know what
#define XYZ
actually does?Majenko– Majenko2016年12月02日 21:41:12 +00:00Commented Dec 2, 2016 at 21:41 -
I think it (along with
#ifndef
and#endif
) is suppose to keep from duplicate code during linking?Fine Man– Fine Man2016年12月02日 21:42:20 +00:00Commented Dec 2, 2016 at 21:42 -
That is what it is being used for. I asked if you know what it does?Majenko– Majenko2016年12月02日 21:42:46 +00:00Commented Dec 2, 2016 at 21:42
-
#define XYZ
class XYZ { };
The first line tells the "C preprocessor" (called before C and C++ compilers) to replace XYZ
with nothing everywhere it happens, hence after preprocessing, and before compiling, that code becomes:
#define XYZ
class { };
This is where C++ compiler complains. It has nothing to do with your file name.
Among C and C++ programmers, it is commonly admitted that header files should be protected by macros named after the file name including the extension:
#ifndef XYZ_H
#define XYZ_H
If you use this practice, you won't have this problem anymore.
-
That's what is inconsistent with my Arduino program and my other ones (Xcode/nano). I forgot to append the
_H_
(or_H
as you prefer).Fine Man– Fine Man2016年12月02日 21:48:36 +00:00Commented Dec 2, 2016 at 21:48