0

Consider:

Enter image description here

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);
}
Peter Mortensen
  • 427
  • 3
  • 12
adrian.wong
  • 17
  • 1
  • 2
  • 3

2 Answers2

4

I can't reproduce your problem still. See this:

Compiler output


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

How the IDE organizes things


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.

Nick Gammon
  • 38,883
  • 13
  • 69
  • 125
1

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).

Please see https://stackoverflow.com/questions/31349865/compiler-error-for-conflicting-variable-declarations-conflicts-with-new-declar.

Mikael Patel
  • 7,989
  • 2
  • 15
  • 21