Consider:
I having a problem in compiling in extern "C" code in the Arduino IDE 1.6.7 which I don't have on version 1.6.5.
The error is:
error: conflicts with new declaration with 'C' linkage
It is complaining about the lines containing loop()
and start_timer(void);
.
This is my code:
#ifdef __cplusplus
extern "C" {
#endif
void start_timer(void);
#ifdef __cplusplus
}
#endif
void start_timer(void)
{
Serial.println("2");
Serial.begin(9600);
delay(2000);
}
void setup()
{
start_timer();
Serial.println("4");
}
void loop()
{
Serial.println("1");
delay(2000);
}
-
Please edit the code and provide the error/warning from the compiler.Mikael Patel– Mikael Patel2016年01月08日 09:30:40 +00:00Commented Jan 8, 2016 at 9:30
-
I can't reproduce that. Please post your full code as Mikael Patel suggested, and the error message. That is: a Minimal, Complete, and Verifiable exampleNick Gammon– Nick Gammon ♦2016年01月08日 11:11:26 +00:00Commented Jan 8, 2016 at 11:11
-
I already updated my previous postadrian.wong– adrian.wong2016年01月08日 11:55:56 +00:00Commented Jan 8, 2016 at 11:55
-
Why do you need to declare C linkage for a symbol directly in your script?Ignacio Vazquez-Abrams– Ignacio Vazquez-Abrams2016年01月08日 20:53:58 +00:00Commented Jan 8, 2016 at 20:53
2 Answers 2
I can't reproduce your problem still. See this:
However if you are having problems (and frankly I expected you to) then you should read this:
How to avoid the quirks of the IDE sketch file pre-preprocessing
I can reproduce your problem in IDE 1.6.5 (not 1.6.7). The code generated by the IDE preprocessor is this:
#line 1 "sketch_jan11a.ino"
#ifdef __cplusplus
#include "Arduino.h"
void start_timer(void);
void setup();
void loop();
#line 2
extern "C" {
#endif
void start_timer(void);
#ifdef __cplusplus
}
#endif
void start_timer(void)
{
Serial.println("2");
Serial.begin(9600);
delay(2000);
}
void setup()
{
start_timer();
Serial.println("4");
}
void loop()
{
Serial.println("1");
delay(2000);
}
You can see that in the automatic function prototype generation that the IDE "helpfully" generates for you, it puts the prototype for start_timer
outside the extern "C" declaration. Thus one function prototype has a declaration in C++ format, and the other in C format.
Why are you even doing this? I presume this is a small example of a larger problem.
If you follow the suggestions in my link How to avoid the quirks of the IDE sketch file pre-preprocessing - did you read that? - the problem goes away, because .cpp files in IDE tabs are not subjected to this extra processing.
-
Please refer to the about image that i just attached for the issue that i'm facing. If i put the whole "start_timer()" function into the extern "C" then i will be working fine.adrian.wong– adrian.wong2016年01月11日 04:03:02 +00:00Commented Jan 11, 2016 at 4:03
-
Which operating system are you using?2016年01月11日 08:28:40 +00:00Commented Jan 11, 2016 at 8:28
-
See amended reply for more info.2016年01月11日 08:36:19 +00:00Commented Jan 11, 2016 at 8:36
The compiler is telling you that there is a conflict between the two definitions of start_timer().
The normal usage of extern "C" is in a header file for functions that are accessed from both C and C++. This actually has to do with how C++ handles names and overloading. Using extern "C" will use normal C name handling and C++ name mangling is turned off (together with overloading, etc).