- Back to Home »
- Programming techniques »
- C/C++ Kết hợp C và C++ source
Saturday, May 2, 2015
Trong một project thường thì sẽ có cả C source code (trong file .c) và C++ source code (trong file .cpp), vậy làm thế nào để kết hợp chúng lại với nhau. Như đã biết để compile C source thì dùng gcc, compile C++ source thì dùng g++, một project có cả C và C++ source thì sẽ dùng g++, vì thế cần loại bỏ các tính chất của C++ khi compile C source. Để làm được điều đó ta sử dụng extern "C" trong file C header.
#ifdef __cplusplus
extern "C"{
#endif
// ... your include, types, methods, variables ...
#ifdef __cplusplus
} //end extern "C"{
#endif
Giữa cặp dấu ngoặc extern là các khai báo các include header, các enum, union, struct, function, ... , tất cả chúng sẽ được implement ở dạng code C thuần túy trong một file .c khác.
Ex
math_operator.h
#ifndef MATH_OPERATOR_H
#define MATH_OPERATOR_H
#ifdef __cplusplus
extern "C"{
#endif
#include <stdio.h>
bool add(float a, float b, float *ret);
bool sub(float a, float b, float *ret);
bool multi(float a, float b, float *ret);
bool devision(float a, float b, float *ret);
#ifdef __cplusplus
} //extern "C"{
#endif
#endif // MATH_OPERATOR_H
math_operator.c
#include "math_operator.h"
#include <stdbool.h>
bool add(float a, float b, float *ret){
*ret = (a+b);
return true;
}
bool sub(float a, float b, float *ret){
*ret = (a-b);
return true;
}
bool multi(float a, float b, float *ret){
*ret = (a*b);
return true;
}
bool devision(float a, float b, float *ret){
if(b != 0){
*ret = ((float)a/b);
return true;
}
return false;
}
main.cpp
#include <iostream>
#include "math_operator.h"
using namespace std;
int main(int argc, char **argv){
float ret;
add(4, 2, &ret);
cout << "4 + 2 = " << ret <<endl;
sub(4, 2, &ret);
cout << "4 - 2 = " << ret <<endl;
multi(4, 2, &ret);
cout << "4 * 2 = " << ret <<endl;
devision(4, 2, &ret);
cout << "4 / 2 = " << ret <<endl;
return 1;
}
Compile & Execute:
$ g++ math_operator.h math_operator.c main.cpp
$ ./a.out
4 + 2 = 6
4 - 2 = 2
4 * 2 = 8
4 / 2 = 2