• ベストアンサー

#includeとexternとCコンパイラ

表題についてお伺いします。 (1)Cファイル内の関数をexternで渡す (2)#includeでCファイルごと定義してその関数を使う では、コンパイルは異なるでしょうか? 具体的には、 (1)はCファイルをCコンパイルする (2)はCファイルをC++コンパイルする になりますか? 前提条件:VS2013proのVC++でMFCアプリで作成するプロジェクト

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

>(1)Cファイル内の関数をexternで渡す externは「宣言文」であり「渡す」と言うのは意味不明です。 >(2)#includeでCファイルごと定義してその関数を使う #includeは「別ソースをその場所に取り込むだけ」であり「定義」云々とは無関係で、意味不明です。 >具体的には、 >(1)はCファイルをCコンパイルする >(2)はCファイルをC++コンパイルする >になりますか? なりません。 「C言語モードでコンパイルするか、C++言語モードでコンパイルするか?」は「コンパイラそのものの仕様」に左右されます。 例えば、VS2013proのVC++なら「ソースファイルの拡張子が.cならCコンパイラモードで、拡張子が.cppならC++コンパイラモードでコンパイルする」と言う仕様になっています。 また、コンパイラオプションに「/Tc」を指定すると拡張子を無視してCモードで、「/Tp」を指定すると拡張子を無視してC++モードでコンパイルする仕様になっています。 「質問そのものが意味不明」であり「Cコンパイラの仕組みを理解できていない」ですから、この質問そのものが成り立ちません。 質問そのものが成り立ちませんから、回答するのも不可能です。 「基礎から勉強し直してきて下さい」としか言えません(意味:顔を洗って出直して来い)

NEW2010
質問者

お礼

厳しいお言葉恐縮です! 勉強し直してきます。 「ソースファイルの拡張子が.cならCコンパイラモードで、拡張子が.cppならC++コンパイラモードでコンパイルする」 上記内容で十分に当方の問題は解決できました! どうもありがとうございます!

関連するQ&A

  • MFCのインクルードファイルについて

    VC++のMFCについて教えていただきたいのですが。 VC++のプロジェクトには、MFCとかコンソールアプリとかあると思うんですが、普通のWinアプリやコンソールアプリにはなく、MFCで標準的にインクルードされるファイルってどんなものがあるのでしょうか。 今、コンソールアプリでコンパイルしたらエラーとなり、MFCでするとエラーなくコンパイルできます。 よろしくお願いします。

  • extern指定子と実装(#include)について

    2点質問があります。 #1.#includeできるのはヘッダーファイルのみなのでしょうか。    ヘッダファイルをインクルードしなくてはいけないのは、わかっ   てます。.c(Cソースコード)はインクルードできないのでしょう   か。 #2.#1と絡んだことについてです。    たとえば、2つの関数Func1()とFunc2()とをメインルーチンと   は別のソースコードに関数の処理を記述したとします。    ファイル名:Func.c    中身:Func1とFunc2の処理内容    次にこれをメインルーチン内で使用するために以下のように記述   して保存したとします。    ファイル名:Func.h    中身:#include "Func.c" extern void Func1(void); extern void Func2(void); 最終的に、ファイル名:main.c         #include "Func.h" --------------- Func1(); Func2(); というようなことは可能でしょうか。

  • C言語で、記憶クラス指定子extern・staticを関数に指定

    C言語の本に、「関数の定義と呼び出す側が別ソースファイルの場合、プロトタイプはヘッダーファイルに書き、定義側と呼び出し側の両方でインクルードしましょう」ということが書かれていました。 例えば、 ===code1a.c=== extern void funcB(int); static void funcA() { funcB(1); } ===code1b.c=== void funcB(int a) { printf("%d\n",a); } このような場合には、もしcode1b.cの中の関数funcBに引数を追加した場合、再コンパイルしても気づかないのでよくない。 そこで、次のようにヘッダーファイルを作り、プロトタイプはそこに書くべきだ。 ***code2b.h*** extern void funcB(int); ***code2a.c*** #include "code2b.h" static void funcA() { funcB(1); } ******code2b.c**** #include "code2b.h" void funcB(int a) { printf("%d\n",a); } 記述は以上のようなことです。 #include "code2b.h" とは、 extern void funcB(int); が書いてあるのと同じだと思います。 私が思ったのは、本の勧める方法では、 funcBを定義しているcode2b.cで、プロトタイプの記憶クラス指定子が、externになっているが良いのか(externとは、別のソースファイルで定義されているという意味ではないか)ということです。 extern, staticは、プロトタイプに書くべきなのか、関数の定義に書くべきなのか、も両方に書くべきなのでしょうか。 私の処理系では、 ・プロトタイプ宣言でexternを付けて関数定義でstaticを付ける、 ・staticを付けた関数を他のソースファイルで呼ぶ、 などの明らかに矛盾する場合は、コンパイルエラーになります。 でも、extern単独での役割はなさそうです。 他の処理系でも同じでしょうか。 (main等省略)

  • VisualStudioでC関数の呼び出し

    VisualStudio2008のなんらかのプロジェクトから C関数の呼び出しを行いたいのですが、 現在、VC++とMFCでWindowsForm等を作成して そこからextern"C"でC言語の関数をcallしているのですが MFC自体、無くなりつつあり、VS2008EXPRESSではサポートされていません。できれば無料版のEXPRESSで実現したいのですが どういう方法があるでしょうか? ダイアログとボタン程度のWindowsFormは使用したいのですが。

  • extern "C" の利用方法に関して

    皆さんこんにちは。 extern "C"使って、 C++に書いてある関数をCでも使おうと、 もがいている最中の者です。 C++側のソース内にある、 Cでも使いたい関数に「eztern "C"」をつけ足しコンパイルに成功しました。 これから、C側でも、 C++から引用したい関数にexternをつけて、 コンパイルをしてしまおうとは思っているのですが、 C++のソース内にある関数を C側でも使うための作業としては、 これだけでいいのでしょうか? 今回作成した 「C++」のソースと「C」のソースは、 全然違うディレクトリにそれぞれ存在しているのですが、 それぞれは、認識され合うものなのでしょうか? お互いのコンパイルにあたってオプションを指定するか、 Makefileで書き換えるべき部分があるのでしょか? 笑ってしまうよな質問でしたらすいませんが、 アドバイスいただけるとありがたいです。 宜しくお願い致します。

  • C言語 extern について

    どうもこんにちは C言語でプログラムを作っています。 複数のファイルから1つのプログラムを作っていますが、あるファイルで実装した関数を別のファイルから使用する際、単にプロトタイプ宣言を行うだけでなく、extern が必要なのでしょうか? 今までは extern を使用せず、以下のように書いてました。 // main.c ファイル int func_sub(); int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } これは extern を使用して、このように書かないとだめなのでしょうか? // main.c ファイル extern int func_sub(); // このexternは必要? int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } 大域変数を他のファイルでも使用する場合はexternが必要ですが、関数に関してもexternを使用しなければならないのでしょうか?

  • C++のデフォルトinclude文?

    こんにちわ。大学でC++を勉強している者です。授業のプロジェクトで自分の作ったC++のプログラムを大学のLinuxサーバでコンパイルしたところ問題なくコンパイルが通り、動作確認も出来たのですが、それを教授に提出したところ、コンパイルが出来ませんと言われました。どうやら教授は若干大学の研究室のコンピュータと違う環境でコンパイルした模様です。教授の部屋に行ってエラーを見たところ、exit, srand, rand等の関数が見つかりませんと言われていました。どれもstdlib.hに属する関数だと思い、#include <stdlib.h>を入れて再提出したところ問題が解決した。が、どうして研究室のマシンではエラーが起きなかったのかが未だにわかりません。g++のコンフィグにデフォルトのinclude文を定義するところがあってそれが違ってたのではないかとか思っているのですが、確かな情報が未だにつかめていません。教授に聞いたのですが、彼はネットワークが専門でC++の専門ではないので「わかりません」とあっさり言われてしまいました。。。環境についてですが、わかっているのは研究室のマシンがCentOS release 5.5だということだけ。教授のマシンは不明です。宜しくお願いします。

  • VC++2010の「#include <」

    VC++ で、他人の作ったソースコードをビルドして実行してみています。 (WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。) VC++自体、あまり理解が深くないのですが、 「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。 「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。 ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェクトの場合は、 ソリューションエクスプローラに、「外部依存関係」というフォルダのショートカットがあり、ライブラリがどっさりあります。 「そうではない」プロジェクトについても、「#include <」で、ヘッダファイルを表示してくれるようにしたいのですが、どの様にすればよいのでしょうか?★ プロジェクトのプロパティの、 C++>プリプロセッサ>プリプロセッサの定義 リンカー>入力>追加の依存ファイル はどちらのソースも同じにしたのですが…。

  • Cコンパイル時のマルチデファイン優先

    Cコンパイル時にincludeファイルの都合上、マルチデファインになってしまいます。 この点はコンパイラが宣言無視をしてくれるのですが、extern優先にしてリンクをするにはどのようにすれば良いのでしょうか。 ファイル内でinclude文(ファイル内)定義より先にextern文でシンボル定義をすれば、extern優先でリンクしてくれるのでしょうか(試して無いのですが)。 コンパラ・リンカ製品の仕様になるのでしょうけれど「マルチデフは絶対ダメ」なコンパイラでない場合、extern宣言を優先にする一般的な方法はありますか 。

  • includeファイルの読み込み追加の際のコインパイルエラー

    VC初心者で初めて質問させて頂きます。 仕事でVC++6.0にて開発を行っています。 既設で正常に動作しているプロジェクトに対して ロジックを追加しなければいけないのですが、 その際、同プロジェクト内で定義されていない 変数を使用したく、includeファイルの 読み込みを追加(#include "aaa.h")し、参照しようと したのですが、以下のようなコンパイルエラーが 発生してしまいます。 '***' 定義されていない識別子です。 ***:追加したincludeファイル内にて定義されている    変数 紐付けがうまくいってないと思うのですが プロジェクトの設定画面にて、インクルードファイル のパスを確認したところ既設にてパスは存在して いました。 同様に依存関係を確認したところ、必要な ヘッダファイルは全てありました。 関係あるかはわかりませんが、クリーン→ビルド しても状況は変わりませんでした。 パスが通っているなら単純にインクルードファイルを 読みこんで参照すればいいと思うのですが、 何か他に必要なことがあるのでしょうか 初めての質問ということで、質問の仕方が 分かりづらい点もあるかと思いますが 宜しくお願い致します。

専門家に質問してみよう