C/C++關鍵字之extern

先來看一段代碼,這段代碼是jni自動生成的代碼。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJni */
#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJni
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
  (JNIEnv *, jobject, jstring);
	//--kill-at
#ifdef __cplusplus
}
#endif
#endif



extern "C"

初次看有些陌生,首先我們先要明白 爲何要使用extern"C",在c++中爲了支持重載機制,在編譯生成的代碼中要對函數的名字進行處理,例如加入函數的返回類型等.而c中只是簡單的函數名而已,不會加入其它東西.試想如果已經有一個c的函數庫供我們c++調用,那麼就會找不到函數,因爲c++中我們的方法名稱已經不再是原來的名字,因此我們需要使用extern"C"告訴編譯器使用c的方式來連接他們.那麼上面出現的結果就是

如果__cplusplus定義了結果爲

extern "C" {
/*
 * Class:     TestJni
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
  (JNIEnv *, jobject, jstring);
	//--kill-at
}
如果沒有定義則

/*
 * Class:     TestJni
 * Method:    sayHello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
  (JNIEnv *, jobject, jstring);

extern是C/C++語言中表明函數和全局變量作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量可以在本模塊或其它模塊中使用

總結一下:

關鍵字extern作用主要是以下兩種:

1、與“C”一起連用-------告訴編譯器在編譯函數名時按照C的規則去而不是按照C++;

2、不與"C"一起修飾變量或函數-------聲明函數或全局變臉作用範圍的關鍵字。

發佈了32 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章