日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中预定义宏的应用

發布時間:2024/8/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中预定义宏的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????? __LINE__?????????????????????? 在源代碼中插入當前源代碼行號??
????? __FILE__?????????????????????? 在源代碼中插入當前源代碼文件名??
????? __FUNCTION__(__fucn__)???????? 在源代碼中插入當前源代碼函數名
????? __DATE__?????????????????????? 在源代碼中插入當前編譯日期〔注意和當前系統日期區別開來〕??
????? __TIME__?????????????????????? 在源代碼中插入當前編譯時間〔注意和當前系統時間區別開來〕????????
????? __STDC__?????????????????????? 當要求程序嚴格遵循ANSIC標準時該標識符被賦值為1。??
????? __cplusplus??
? 標識符__LINE__,__FILE__,__func__通常用來調試程序;??

? 標識符__DATE__和__TIME__通常用來在編譯后的程序中加入一個時間標志,以區分程序的不同版本;

? 當要求程序嚴格遵循ANSIC標準時,標識符__STDC__就會被賦值為1;

? 當用C++編譯程序編譯時,標識符__cplusplus就會被定義。

#include <stdio.h>
#include <stdlib.h>
void why_me();
int main()
{
??? printf( "The file is %s./n", __FILE__ );
??? printf( "The date is %s./n", __DATE__ );
??? printf( "The time is %s./n", __TIME__ );
??? printf( "This is line %d./n", __LINE__ );
??? printf( "This function is %s./n", __func__ );
??? why_me();
??? return 0;
}

void why_me()
{
??? printf( "This function is %s/n", __func__ );
??? printf( "The file is %s./n", __FILE__ );
??? printf( "This is line %d./n", __LINE__ );
}


時常在cpp的代碼之中看到這樣的代碼:

#ifdef __cplusplus
extern "C" {
#endif

//一段代碼

#ifdef __cplusplus
}
#endif
  

??? 這樣的代碼到底是什么意思呢?首先,__cplusplus是cpp中的自定義宏,那么定義了這個宏的話表示這是一段cpp的代碼,也就是說,上面的代碼的含義是:如果這是一段cpp的代碼,那么加入extern "C"{和}處理其中的代碼。

  要明白為何使用extern "C",還得從cpp中對函數的重載處理開始說起。在c++中,為了支持重載機制,在編譯生成的匯編碼中,要對函數的名字進行一些處理,加入比如函數的返回類型等等.而在C中,只是簡單的函數名字而已,不會加入其他的信息.也就是說:C++和C對產生的函數名字的處理是不一樣的. 目的就是主要實現C與C++的相互調用問題。


?
c.h的實現
#ifndef _c_h_
#define _c_h_

#ifdef __cplusplus
extern "C" {
#endif

void C_fun();

#ifdef __cplusplus
}
#endif

#endif
-----------------------------------
c.c的實現
#include "c.h"
void C_fun()
{
}
------------------------------------
在cpp.cpp中調用c.c中的C_test()
cpp.cpp的實現
#include "c.h"
int main()
{
???? C_fun()
}
其中__cplusplus是C++編譯器的保留宏定義.就是說C++編譯器認為這個宏已經定義了.
所以關鍵是extern "C" {}
extern "C"是告訴C++編譯器件括號里的東東是按照C的obj文件格式編譯的,要連接的話按照C的命名規則去找.
==========================
那么C中是如何調用C++中的函數cpp_fun()呢?
因為先有C后有C++, 所以只能從C++的代碼中考慮了.
加入C++中的函數或變量有可能被C中的文件掉用,則應該這樣寫,也是用extern "C"{}
不過是代碼中要加,頭文件也要加,因為可能是C++中也調用
--------------------------------------
cpp.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void CPP_fun();
#ifdef __cplusplus
}
#endif
#endif
.-------------------------------------------
Cpp.cpp的實現
extern "C" {??? //告訴C+++編譯器,擴號里按照C的命名規則編譯
void CPP_fun()
{
???? .....
}
?
?
總結
C和C++對函數的處理方式是不同的.extern "C"是使C++能夠調用C寫作的庫文件的一個手段,如果要對編譯器提示使用C的方式來處理函數的話,那么就要使用extern "C"來說明。

總結

以上是生活随笔為你收集整理的C语言中预定义宏的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。