C代碼與C++互相調用的小技巧

2021-01-19 電子工程專輯


由於C++編譯器默認都是按照C++的編譯方式來對源文件進行編譯,這樣C語言文件也會直接採用C++編譯。

對於底層的驅動等都會以使用C語言編寫的DLL等給出來,然後從中導出函數給C或C++的模塊來進行訪問,所以還是需要C++語法中能夠標識出來給編譯器,哪些需要採用C++方式編譯,哪些需要採用C方式編譯。

那麼這個編譯區分就由extern "C"來完成,下面我們就以一個例子看看如何使用的。

//FileName : main.c 
#include <iostream>
#include <stdio.h> 
#include "Cal.h"

int main(int argc, char** argv) {
 
 printf("Cal(int): %d\n",Cal(5));
 printf("Cal(float): %.5f\n",Cal(1.1f));
 return 0;
}

//FileName : Cal.c
#include "Cal.h" 

int Cal(int Val)
{
 return Val*Val;
}

float Cal(float Val)
{
 return Val*Val;
}

//FileName : Cal.h
#ifndef __CAL_H__
#define __CAL_H__

//extern "C"
//{

 int Cal(int Val);
 float Cal(float Val);

//}
#endif


以上extern 「C」注釋部分表示的就是Cal.c文件將會以C編譯方式進行,由於C++支持函數重載而C語言不支持函數重載,所以以上源碼可以直接編譯可以通過,而一旦把extern"C"注釋去掉,便會編譯失敗。


相關焦點

  • C/C+編程筆記:在C+中如何調用C語言的代碼?你可以這樣做
    很多初學的小萌新,第一反應很有可能是:直接調用就完事了!這樣說也沒錯,因為C++本來就包含了C。比如在C文件中存在一個函數func_c(), 該文件與C++的工程混編在一起時,可以直接在C++中調用C文件中的func_c();不需要做任何額外處理。
  • C語言?c+?到底先學哪個才能更好的理解編程,這些你造嗎
    本身C語言和c++的編程方法不同,一個面向過程,一個面向對象。而要做出大型的、複雜的、精彩的程序,面向對象的語言就更適合。所以要學習c++這樣的語言。但是,1.c語言是好多學校的基礎課;2.c語言很容易描述算法;3.軟體開發過程中也有很多面向過程的開發,以及模塊化程序設計思想。要學習這些,比起學c++的複雜、困難程度,學c語言就可以達到上述目的。
  • DSP編程技巧之15-使用代碼優化時必須考慮的五大問題
    在優化代碼時,編譯器會重新調整某些代碼段的順序,自己決定使用某些寄存器(例如AR0-AR7這樣的輔助寄存器),甚至刪除某些編譯器認為無用的變量、函數等,但是編譯器一般情況下並不會對內嵌的彙編代碼進行任何優化(除非這段彙編代碼被編譯器認為是永遠不會執行到的無用代碼),這就造成了編譯器的優化效果在這段彙編代碼和它的上下文代碼中無法進行有效的優化,特別是彙編代碼和C/C++代碼直接存在變量調用的情況下。
  • 「最佳實踐」C++陷阱與套路
    = nullptr && ptr->Do())這樣的代碼,這正是利用了操作符短路的語法特徵。## 4.別讓循環停不下來```c++for (unsigned int i = 5; i >=0; --i){//...}```程序跑到這,WTF?根本停不下來啊?
  • Electron 調用 原生代碼的正確打開方式,不是ffi!
    electron 很不錯,可以實現跨平臺應用的開發,但是如果需要跟硬體交互就顯得欠缺了,好在 electron 實際上是 node js + html + css,而 nodejs 想要調用本地代碼還是可以實現的。我也是基於這個想法去做的,但是遇到了一堆的問題。
  • C語言函數調用過程中的內存變化解析
    這個調用不是指C 語言上的函數調用的語法,而是在內存的視角下,函數的調用過程。本文將從C 語言調用實例,內存視角,反彙編代碼來探討C 語言函數的調用過程,也可以說是C 語言函數調用過程圖解。通過這個C 語言函數調用過程圖解,同學們將會知道,C 語言函數在調用時,內存空間是怎樣變化的。 要想理解這一個過程還好涉及到函數棧幀的概念。
  • JavaScript速記技巧:向著更清晰的代碼邁進
    圖源:unsplash無論是哪個程式語言的速記技巧,都有助於你編寫更好、更清晰的代碼。藉助速記技巧,不僅可以提升代碼可讀性,還可以編寫更少代碼完成任務。下面是一些JavaScript的速記技巧。let [a, b, c] = [5, 8, 12];3.三元運算符使用三元運算符(條件),五行代碼可以簡化為一行。
  • C++ 優先隊列priority_queue
    +/datastruct$ g++ priorityqueue.cpp -o commonsort -std=c++11albert@home-pc:/mnt/c++/datastruct$ ./commonsort16151310985321如果是完整排序使用優先隊列就有些麻煩了,還不如直接調用 std::sort 函數,但是如果只取部分數據的話,優先隊列還是非常方便快速的,比如下面這個問題。
  • VS2019:進一步新增了C+代碼分析規則
    如果使用/std:c++17編譯選項,則一個枚舉可以使用一個顯式的底層類型或者沒有枚舉器的形式來進行定義,由此可以引入一種新的,不能和其他類型進行隱式類型準換的整數類型。 Unscoped枚舉可以被隱式轉換為int類型,而Scoped枚舉則不能被隱式轉換為int,只能使用強制類型轉換才能實現。
  • C++中的static
    0;//定義並初始化靜態數據成員   Myclass::Myclass(int a,int b,int c)   { this->a=a;   this->b=b;   this->c=c;   Sum+=a+b+c;}   void Myclass::GetSum()   { cout<<"Sum="<<Sum<<endl;   }   void
  • 乾貨 | 惡意代碼分析之Office宏代碼分析
    有時候,宏代碼會解密釋放出一個powershell代碼,再調用powershell腳本,通過powershell腳本去實現環境檢測、文件下載等功能。宏代碼基於的是VB的語法,如果沒有混淆的宏代碼閱讀起來倒是比較方便,但是現在的大多數宏樣本都會有混淆和一些反調試手法,所以在遇到各類宏代碼的時候也要根據情況去分析。
  • 搭建C語言開發環境,其實只需要兩個工具就行了!
    工欲善其事必先利其器,對於c語言學習來說,重要的不是看了多少本書,而是打了多少行代碼。在手打代碼之前,我們當然要先搭建自己的開發環境,對於c語言的學習來說,其實只需要兩個工具就行了,那就是文本編輯器和c編譯器了。
  • c編譯器so easy,gcc c編譯器生成、使用動靜態庫
    main.c(見程序3)為測試庫文件的主程序,在主程序中調用了公用函數hello。因此,我們必須將源程序hello.c通過gcc先編譯成.o文件。這個時候我們有三種思路:1) 通過編譯多個源文件,直接將目標代碼合成一個.o文件。2) 通過創建靜態連結庫libmyhello.a,使得main函數調用hello函數時可調用靜態連結庫。
  • C/C+學習日記:C+基礎知識—結構、聯合和枚舉
    本文章向大家介紹C++ 基礎知識,結構、聯合與枚舉,主要使用實例、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。 1. 結構
  • C語言中「c=a+b」,這種結構合理嗎?
    c = a+++b; 以下代碼是合法的嗎,咋的一看不禁有這樣的疑問? int a = 5, b = 7, c; c = a+++b; 這個代碼確實不咋符合習慣的寫法,但是不管你相不相信,上面的例子是完全合乎語法的。
  • 大牛用VScode寫C/C++嘛?VScode集成MinGW
    C/C++:這個插件提供代碼智能提示,以及調試功能安裝完成之後,點擊文件->新建文件->選擇文件類型(右下角),然後按Ctrl+S保存為.c文件(不保存代碼不會提示)Code Runnner:運行代碼的套件