天天看點

C語言和C++如何互相調用

作者:霸都嵌入式

C語言和C++是兩種不同的程式設計語言,它們有不同的文法、資料類型和編譯器。如果想要在C語言和C++之間互相調用函數或類,需要遵循一些規則和方法。這裡介紹四種常見的情況:

- **C++程式調用C程式**:這是一種在C++中使用extern "C"修飾符來聲明和調用C語言中定義的函數的方法。這樣可以避免C++編譯器對函數名進行修飾(mangling),導緻C語言無法識别。例如,在C語言中,可以這樣定義一個函數:

void f(int i) {
	printf("int: %d\n", i);
}           

然後在C++中,可以這樣聲明和調用這個函數:

extern "C" void f(int i); // 聲明C語言中的函數
f(10); // 調用C語言中的函數           

- **C程式調用C++程式(C++程式不涉及類、成員函數)**:這是一種在C++中使用extern "C"修飾符來定義和導出供C語言中調用的函數的方法。這樣可以避免C++編譯器對函數名進行修飾(mangling),導緻連結錯誤。例如,在C++中,可以這樣定義一個函數:

extern "C" void g(int i) {
	cout << "int: " << i << endl;
}           

然後在C語言中,可以這樣聲明和調用這個函數:

void g(int i); // 聲明C++中的函數
g(10); // 調用C++中的函數           

- **C程式調用C++程式(C++程式涉及類、成員函數)**:這是一種在C++中使用結構體struct來包裝類class,并提供相應的接口函數供C語言中調用的方法。這樣可以實作面向對象的程式設計風格。例如,在C++中,可以這樣定義一個類和一個結構體:

class Animal {
  private:
  int age;
  public:
  Animal();
  virtual ~Animal() {}
  void setAge(int);
  int getAge();
  virtual void say() = 0;
};
struct AnimalStruct {
  Animal* animal;
};           

然後在C++中,可以這樣定義一些接口函數:

extern "C" {
  void initAnimal(struct AnimalStruct** as, int i, int type);
  void setAge(struct AnimalStruct* as, int age);
  void sayAge(struct AnimalStruct* as);
  void deleteAnimal(struct AnimalStruct** as, int i);
}           

最後在C語言中,可以這樣聲明和調用這些接口函數:

struct AnimalStruct;
void initAnimal(struct AnimalStruct** as, int i, int type);
void setAge(struct AnimalStruct* as, int age);
void sayAge(struct AnimalStruct* as);
void deleteAnimal(struct AnimalStruct** as, int i);
struct AnimalStruct* animals[2];
initAnimal(animals, 0, 0); // 建立一個Dog對象
initAnimal(animals, 1, 1); // 建立一個Cat對象
setAge(animals[0], 3); // 設定Dog對象的年齡為3
setAge(animals[1], 2); // 設定Cat對象的年齡為2
sayAge(animals[0]); // 輸出Dog對象的年齡和叫聲
sayAge(animals[1]); // 輸出Cat對象的年齡和叫聲
deleteAnimal(animals, 0); // 删除Dog對象
deleteAnimal(animals, 1); // 删除Cat對象           

- **混合編譯**:這是一種将C語言和C++分别用gcc和g++編譯成.o檔案,然後再連結成可執行檔案的方法。這樣可以實作混合程式設計。例如,在Makefile中,可以這樣寫:

all: main
main: main.o foo.o
g++ -o main main.o foo.o
main.o: main.c foo.h
gcc -c main.c
foo.o: foo.cpp foo.h
g++ -c foo.cpp
clean:
rm -f main *.o           

其中,main.c是C語言檔案,foo.cpp是C++檔案,foo.h是共享的頭檔案。

系列文章持續更新,如果覺得有幫助請點贊+關注!

繼續閱讀