我可以使用extern“C”{标题文件的c}

时间:2015-01-02 10:21:56

标签: c++ c linkage

而不是在"中写入每个功能; extern "C" {}",我可以在该块中写入整个头文件。

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

我试过这个,但它根本不工作,为什么它不起作用? 如果我们必须在c ++项目中使用100 C函数,我们是否需要提供a中的所有函数 extern block,还有其他简单的方法吗?

前:

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

还有其他简单方法,例如extern "C" { myCfunctions.h } ???

2 个答案:

答案 0 :(得分:7)

#include只是在#include的位置包含指定的标头。它是否有效取决于"myCfile.h"包含的内容。特别是,在这样的上下文中包含任何标准库头文件是无效的,并且可能会破坏常用的实现。

处理此问题的常用方法是使标头本身可以安全地从C ++中使用。仅限C的标头可能包含

#ifndef H_MYCFILE
#define H_MYCFILE

#include <stddef.h>

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

#endif

调整它以使其在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

使用这样的标头,您将无法安全地将整个标头放在extern "C"块中。但是,该标头本身可以确保#include <stddef.h>置于extern "C"块中,但仍将所有函数声明放在单个extern "C"块中,避免不得不为每一个重复它。

答案 1 :(得分:-1)

你做错了什么。

由于

extern "C" { myCfunctions.h }

应该有效。见下面的示例程序。


让我们通过示例代码。

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 *);

现在让我们从那个

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

现在让我们制作基于cpp的文件,它将使用这个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;

}

现在让我们用C库编译这个c ++程序

g++ prog.cpp libctest.a

输出是: 值为15Value is100