NDestiny
NDestiny

Reputation: 1181

can I use extern "C" { headerfile of c }

Instead of writing each function in " extern "C" {} ", can I write entire header file inside that block.

extern "C"
{
  #include "myCfile.h" 
} 

I have tried this but Its not working at all, why it is not working ? if we have to use 100 C functions in a c++ project, do we need provide all the functions in a extern block, is there any other simple way ?

Ex:

extern "C"
{
 void fun1();
 void fun2();
 void fun3();
 void fun4();
 void fun5();
 .
 .
 .
 .
 fun100();
}

Is there any other simple way, like extern "C" { myCfunctions.h } ???

Upvotes: 2

Views: 2356

Answers (2)

user743382
user743382

Reputation:

#include simply includes the specified header at the location of the #include. Whether it's valid depends on what "myCfile.h" contains. In particular, including any standard library headers in such a context is not valid, and may well break on commonly used implementations.

The usual way to handle this is to make the header itself safe to use from C++. A C-only header might contain

#ifndef H_MYCFILE
#define H_MYCFILE

#include <stddef.h>

void mycfunc1(void);
void mycfunc2(int i);
void mycfunc3(size_t s);

#endif

Adapting this to make it safe to use from C++:

#ifndef H_MYCFILE
#define H_MYCFILE

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

void mycfunc1(void);
void mycfunc2(int i);
void mycfunc3(size_t s);

#ifdef __cplusplus
}
#endif

#endif

With such a header, you wouldn't be able to safely put the entire header in an extern "C" block. However, that header itself can make sure not to put #include <stddef.h> in an extern "C" block, but still to put all function declarations in a single extern "C" block, avoiding having to repeat it for each one.

Upvotes: 7

Jeegar Patel
Jeegar Patel

Reputation: 27210

You are doing something wrong.

Because

extern "C" { myCfunctions.h }

should work. See below sample program.


Lets go by example code.

ctest1.c

#include<stdio.h>

void ctest1(int *i)
{
   printf("This is from ctest1\n"); // output of this is missing
   *i=15;
   return;
}

ctest2.c

#include<stdio.h>

void ctest2(int *i)
{
   printf("This is from ctest2\n"); // output of this is missing
   *i=100;
   return;
}

ctest.h

void ctest1(int *);
void ctest2(int *);

Now lets make c library from that

gcc -Wall -c ctest1.c ctest2.c
ar -cvq libctest.a ctest1.o ctest2.o

Now lets make cpp based file which will use this c apis prog.cpp

#include <iostream>
extern "C" {
#include"ctest.h"
}
using namespace std;

int main()
{
  int x;
  ctest1(&x);
  std::cout << "Value is" << x;
  ctest2(&x);
  std::cout << "Value is" << x;

}

Now lets compile this c++ program with C library

g++ prog.cpp libctest.a

Output is : Value is15Value is100

Upvotes: -1

Related Questions