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语言中预定义宏的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: System.getProperty(u
- 下一篇: java多线程笔记补充之线程控制操作