I'm creating an Arduino library and have 3 files - a "test.ino" program, and two library/class files: "testLibrary.h" and a "testLibrary.cpp".
The library makes use of some hardware-specific resources such as registers and ISRs that depend upon which I/O pin is used, and this should be done at compile time.
I would like to #define a pin number in the main program which, at compile time, is used in the library to determine which code sections are activated. Since this will be a standard Arduino library for use by others, it should compile and run without users having to change their compiler or #include path to make it work.
But it seems that the scope of #define in the main program/sketch does not extend to the library.
test.ino
#define PIN_NUMBER 3
#include "testLibrary.h"
void setup() {}
void loop() {}
testLibrary.h
#ifndef _TESTLIBRARY_h
#define _TESTLIBRARY_h
#ifndef PIN_NUMBER
#error PIN is not defined
#endif
class test {
public:
test();
~test();
};
#endif
testLibrary.cpp
#include "testLibrary.h"
test::test(){}*
test::~test(){}
Compiling the above branches to "#error" using the Arduino IDE 1.8.13 and also using Visual Studio with Visual Micro.
Is there a way for me to have an Arduino library use a "#define" from the main sketch?
1 Answer 1
The scope of a #DEFINE
macro is the translation unit. That is the current .c
or .cpp
file that is currently being compiled.
In you code PIN_NUMBER
is defined in test.ino
. The #include
macro literaly copies the content of testLibrary.h
into test.ino
. So for the compiler this is working perfectly fine as PIN_NUMBER
is defined.
Your testLibrary.cpp
however is not happy with that. Including testLibrary.h
for compilation lacks the definition of PIN_NUMBER
.
The Arduino IDE is very limited and does not offer you a way to define PIN_NUMBER
globally. This is usually done with the compiler argument -DPIN_NUMBER=3
. All translation units will get this argument and thus the compilation would succeed. No need to define PIN_NUMBER
in code.
-
Unfortunately adding a compiler argument is not a solution - the whole problem setting was due to attempting to make a standard library which any Arduino IDE user could simply download and include without having to make any subsequent changes.Zanshin– Zanshin2021年02月10日 07:35:04 +00:00Commented Feb 10, 2021 at 7:35
-
In the answer to a similar question it’s suggested to put the #define in a header file that is then included into all the translation units (i.e., ino, c or cpp files) arduino.stackexchange.com/questions/23681/…RowanP– RowanP2022年03月06日 13:49:13 +00:00Commented Mar 6, 2022 at 13:49
PIN_NUMBER
in your code. Or is that a copy&paste error?#endif
but only one#if
in testLibrary.h. This will cause a compilation error if you definePIN_NUMBER
in your main code (test.ino) when it skips the#error
in testLibrary.h. Maybe you did not notice the#endif without #if
error? You can fix it by inserting#define _TESTLIBRARY_h
as the first line of testLibrary.h. I.o.w. the scope ofPIN_NUMBER
will be global if you define it in test.ino. Try it.begin()
method.