extern「C」およびvs 2008の例について

4083 ワード

1.まずvs 2008のCとC++ファイルのそれぞれのコンパイルについて紹介する
(1)1つの工程の下でそれぞれCとC++ファイルをコンパイルしてリンクする:
別々にコンパイルするのは簡単です.
設定するファイル:属性-->C/C++-->上級-->を選択し、ドロップダウンメニューから「Cコード(/TC)[またはC++コード(/TP)]にコンパイル」を選択します.これにより、異なる言語のファイルをそれぞれコンパイルできます.
次の作業は、リンクの内容を設定することです.コンパイラによって生成されるターゲットファイルでは、シンボルテーブル内のシンボル命名基準が異なる可能性があるため、リンク時に「解析できない外部シンボル」というエラーが発生します.この問題を解決するには,extern「C」を用いてリンク指示を行う.
(2)次のようなコンパイルエラーが発生した場合:
1>cl:     error D8045 :     /clr      C   “.\C_Header.c”
 
  
     /clr  :
    ->  ->      (               );

——————————————————————————————————————————————————————————————————2.次にexternとCについて説明します
i.externはC/C++言語における関数とグローバル変数の作用範囲である(可視性)は、宣言された関数および変数がこのモジュールまたは他のモジュールで使用可能であることをコンパイラに示すキーワードです.通常、モジュールのヘッダファイルで他のモジュールに参照される関数およびグローバル変数をキーワードexternで宣言します.たとえば、モジュールBがモジュールAで定義されたグローバル変数および関数を参照する場合は、モジュールのみを含める必要があります.ブロックAのヘッダファイルでよい.このように、モジュールBでモジュールAの関数を呼び出すと、コンパイル段階では、モジュールBはその関数が見つからないが、エラーは報告されない.この関数は、モジュールAのコンパイルによって生成された接続フェーズのターゲットコードから検出されます.
externに対応するキーワードはstaticであり、修飾されたグローバル変数と関数は本モジュールでのみ使用できます.したがって、1つの関数または変数が本モジュールでのみ使用可能である場合、extern「C」によって修飾されることはできません.
ii.extern "C"
1 extern   "C"   char * strcpy ( char *, const   char *);
次の宣言とは異なる点に注意してください.
1 extern   char * strcpy ( char *, const   char *);
次の宣言は、接続時にstrcpy()を呼び出すことのみを示します.
extern「C」命令は、CとC++の近親関係のため、非常に有用である.注意:extern「C」コマンドのCは、言語ではなくコンパイルと接続規則を表します.Cは、Fortran、assemblerなど、C言語のコンパイルおよび接続規則に適合する任意の言語を表す.
また、extern「C」コマンドはコンパイルと接続規則のみを指定しますが、意味には影響しません.たとえば、関数宣言でextern"C"を指定しても、C++のタイプ検出、パラメータ変換ルールを遵守します.
次の例を参照してください.変数を定義するのではなく変数を宣言するには、宣言時にexternキーワードを指定する必要がありますが、「C」を追加すると、意味は変わりませんが、コンパイルと接続方法が変わります.
多くの言語にextern「C」を付ける場合は、extern「C」{}に入れることができます.
iii.(結論)上記の2つの節の分析を通じて、extern“C”の本当の目的は実現することであることを知っています
クラスCとC++のハイブリッドプログラミング
.C++ソースファイルの文の前にextern“C”を付けて、それがクラスCのコンパイルと接続規則に従ってコンパイルして接続することを表明して、C++のコンパイルの接続規則ではありません.これによりクラスCのコードにC++の関数or変数などを呼び出すことができる.(注:私がここで言ったクラスCは、C言語のコンパイルと接続方式と一致するすべての言語を表しています)
3.C++でCの関数を呼び出す
//   C_Header.h
#ifndef _C_HEADER_H
#define _C_HEADER_H
extern void print(int i); //extern    
#endif
//C    C_Header.c
#include 
#include"C_Header.h"
void print(int i)
{
	printf("i = %d
",i); }

//C++   :Main.cpp
#ifdef  __cplusplus
extern "C"
{
#endif
	#include "C_Header.h"
#ifdef  __cplusplus
}
#endif
#include
int main(int argc,char** argv)
{
print(3);
int i = 0;
std::cin>>i;
return 0;
}
4.C C++
//c++   C++.h
#ifndef _CPLUSPLUS_H
#define _CPLUSPLUS_H
extern "C" void show(int i);//      extern "C"
#endif

//C++   :C++.cpp
#include "C++.h"
#include
void show(int i)
{
	std::cout<

//C   :C.c
extern void show(int i);//     #include"C++.h",  C      extern "C"
#include 
int main()
{
	int i = 8;
	show(i);
	scanf("%d",&i);
	return 0;
}

                                                                                      , 。