Why can't my .cpp file have a class of the same name? 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 '&lt;anonymous class&gt;' used as declaration
 };
 ^
exit status 1
abstract declarator '&lt;anonymous class&gt;' 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.
#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.