• ベストアンサー

VisualC++のプリプロセッサ定義とビルド関係

VisualC++のプロジェクトには「#define _MYDEBUG」というプリプロセッサと同じ働きをするプリプロセッサ定義という設定項目がプロジェクトのプロパティにありますが、これらがコンパイラによって使用されるタイミングはどのようなものでしょうか? VisualC++コンパイラがソースパーズ時にプロジェクトのプリプロセッサ設定を参照しに行ってコンパイル結果に反映させるといったことが行われているのでしょうか?

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

  • ベストアンサー
  • haniriito
  • ベストアンサー率57% (12/21)
回答No.1

こんにちは。 「VisualC++コンパイラがソースパーズ時にプロジェクトのプリプロセッサ設定を参照しに行って」 というよりは、 「VisualC++(=IDE)が、コンパイラに/Dオプションを渡すことで、プリプロセッサマクロを渡している」 というべきでしょう。 VisualC++をお持ちなら次の項目を確認してみてください。  ○プロジェクト(または個別のソースファイル)のプロパティを開いて、「構成プロパティ」→「C/C++」→「プリプロセッサ」のなかの「プリプロセッサの定義」に_MYDEBUGを追加する。  ○次に、「構成プロパティ」→「C/C++」→「コマンドライン」を開くと、あなたが指定したプリプロセッサ定義が、/D "_MYDEBUG"などのように追加されて、コンパイラにコマンドラインオプションとして引き渡されることが確認できます。

okdummy001
質問者

お礼

ありがとうございました。

okdummy001
質問者

補足

簡潔で具体的なご回答で助かりました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • プリプロセッサのエラー対策がわからない状態

    こんにちは。 VS.2005でプログラミングをしているのですがプリプロセッサで起こるエラーの対策が分からずに 悩んでいます。 エラー内容は以下のとおりです。 warning C4067: プリプロセッサ ディレクティブの後に余分な文字がありました - 改行が必要です この状態を改善するには、/ZaコンパイラオプションがどうのこうのとMSのHPには載っていますが どのようにやればいいのか分かりません。 以下にソースコードを載せておきます。 #ifndef _TEXT(x) // TEXTマクロを使うとこの警告が表示されるようです。 #define _TEXT(x) __T(x) #endif この警告を無くすにはどうしたらいいでしょうか? よろしくお願いします。

  • defineで定数が置き換えられない?(C言語)

    #defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。

  • 他の.CPPファイルに定義した関数を呼び出す方法について

    新規作成したプロジェクトに、 以前自分が作成した.cppファイルと.hファイルを そのまま使えないかと考えています。 (※仮にそのファイルの名前を "define.cpp" "define.h" とします) プロジェクトに新規ファイル main.cpp を作成して、 define.hをインクルードし、 以下のようなテストのプログラムを組みました。 ・../util/define.cpp---------------------- #include <iostream> #include "define.h" void test(){ std::cout<<"test."<<std::endl; } ・../util/define.h------------------------ #pragma once void test(); ・main.cpp---------------------------- #include "../util/define.h" int main(){  test();  return 0; } 上記のソースを VisualC++7.0 でビルドすると、 main.cppの3行目で以下のようなエラーが出ました。 > LNK2019: 未解決の外部シンボル "void __cdecl test(void)" が関数 _main で参照されました VisualC++で「既存項目の追加」という項目より、 実体の定義されたdefine.cppをプロジェクトに追加していないため 当然といえば当然なのですが・・・ C言語でいうところの<stdio.h>等みたいに、 わざわざプロジェクトにCPPファイルを追加しなくても 関数を呼び出せるようには出来ないのでしょうか? 全ての関数と処理をヘッダーファイルに記述すると解決ですが 物凄く見辛いのでそれは避けたいのです。 また、色々なPC間で使っているため(学校のPCなので)、 ツール自体のプロパティを弄らない方法があるのでしたら、 多少面倒でもそちらの方が好ましいです。 追加する方法があるかどうか、 あればその方法をご存じでしたら教えていただければ嬉しいです。 よろしくお願いします。

  • VisualC++でエラーが大量に

    学友がVisualC++で困っています。 私では力になりません 代わりに救済をお願いします。 彼曰く VisualC++2005をインストール。 C++設定で新規プロジェクトをウィザードを使って、MFCアプリケーションスタイルで作成してすぐにビルドを行うとエラーが109件。 エラーの中には構成文エラーや「識別子が定義されていない」などのエラーが含まれます。 原因と対策お願いします

  • ソースとヘッダについて

    VC++2008を使っています。これは他でもいえるのではないかと思いますが、一応プロジェクトの種類はWindowsFormアプリケーションです。 字数削減や書きなおしを楽にするために、ある程度のマクロを織り交ぜたコーディングをしたいのですが ソースに#defineしたものの効果範囲は、#undefの場所まで あるいはそれがなければそのソースの終了地点まで でしょうか? もしそうなら、ソースに書く分なら「別のソースに同じマクロを、全く違う定義をして使っても問題ない」という事でしょうか? ヘッダに書いた場合は、なんか#undef文を下の方に書いてもまるで上に書いたかのように「駄目」という判定になってしまったのですが、かといって#undefを書かないとそのヘッダをインクルードする他のヘッダにも影響を与えてしまうようで… これをどうにかできる方法はありませんか? また、ソースでは #pragma once などをしなくてもいいのですか? (あるいは書いてもソースはオブジェクトファイルに変換され、実質的にはコンパイル後に影響が出るため、プリプロセッサはコンパイル前に完了するので、ソースにこれを書いたところで無意味ということでしょうか?)

  • 新規ソース内のマクロ定義が既存ソース内のマクロ定義と衝突しない策について

    C言語です。 Effective C++か何かで読んだ const int hoge = 3; const char *bar = "HOGEHOGE"; などを使用しようと思ったのですが、 C言語ではコンパイルする際に、 「関数の外では定数は宣言できません」?? のようなエラーが出てしまいました。 そこでこれらを使用するのは諦めて、 #define~を使って定数を使用しました。 (上記のようなエラーが出てしまうのは、 C言語の仕様上、文法がおかしいからだと 思います。そもそもC++に関する本に 載ってるtipsだし^^;) #defineを使用するように修正して、コンパイルする際に、 既存のソース上のマクロ定義(#define~)と名前が重複するものが いくつか見つかり、修正に手間がかかりました。 マクロ定義なので、スコープという概念は 適用されないと思うので、既存のソースと新規のソースで マクロ定義がバッティングしないようにする策としては どのようなものがあるでしょうか? 今のところ思いつくものとしては以下です。 ・新規のソースに関するキーワードをプリフィックスとして使用する ・新規のソースの末尾で#undefをする。(これは試してないので有効か  どうか自信がありません。) 他に何か有効な策がありましたら教えてください。 よろしくお願いいたします。

  • VisualC++2008 EEの設定が・・

    以前は 関数の中でカンマなどを入力すると変数の形式が出たり、 構造体等のメンバはドット、アロー演算子入力で候補が 出ていたのですが、出なくなってしまいました。 思い当たるのは、 ・先日PCが不調になり、VisualC++2008 ExpressEditionを正常に終了。 ・PC再起動後、VisualC++2008 EEを起動すると何か壊れたと警告が。 ・最後に開いたソースファイルが表示されずグレーの背景が出た。 ・Ctrl+F5(デバッグなしで開始)すると全ソースの再コンパイルが起きて  プログラムはちゃんと動いた。 という事です。 何が壊れて、どうすれば元の設定に戻す事ができるようになるでしょうか?

  • ビルドから除外されたソースのコンパイル

    現在、Visual Studioを使用してある巨大なプロジェクトを開発しています。言語は C++です。 このプロジェクトには、ソースファイル(*.cpp)が全部で1000以上もありま す。百ではありません、千です。 そのため、プロジェクトをビルドするのに30分以上もかかり、開発効率が非常に悪 くなっています。 コンパイル・リンクとも相当の時間がかかっています。実感としては、cpp1ファイ ルにつきコンパイル1秒かかっています。 (なぜそんなに大量のcppが必要なのかというのはここでは置いといてください) そこで、次のような方法でビルド時間を短縮する方法を考案しました。 (1)ある一定数のソースファイルのプロパティで「ビルドから除外」とする。 (2) (1)でビルドから除外したソースファイルを全てインクルードしたソース ファイルを作成し、プロジェクトに追加する。 [1つにまとめたソースファイルのイメージ] #include "src001.cpp" #include "src002.cpp" #include "src003.cpp" ・・・ #include "src999.cpp" ソースファイルを1つにまとめてしまう事による弊害は全て解決したものとします。 以上により、プロジェクト内のソースファイル数を100以下にまで減らし、無事ビ ルド時間が大幅に短縮されました。 と、ここまでは良かったのですが、一つ問題があります。 それは、「ビルドから除外」したソースファイルを単独でコンパイル出来なくなって しまうのです。(ここでは、そういうことをしたいという要望があると思ってくださ い) ソリューションエクスプローラでソースファイルを右クリックし、出てくるメニュー リストの「コンパイル」が無効表示され選択できません。 もちろん、コンパイルコマンド(cl.exe)をコマンドラインから直接叩いてやればい くらでも出来ますが、出来ればIDEから簡単な操作で行いたいのです。 また、チームで開発しているため、コンパイルする時だけソースファイルの設定を変 更するというようなことはしたくないのです。 この問題に対して、何か良い手段はないでしょうか? プロジェクトを複数モジュールに分離して・・・ とか、 プリコンパイル済みヘッダを利用して・・・ とか、 リビルド時間を短縮するためソース間の依存関係を減らして・・・ というような、質問の内容を超える回答はご遠慮ください。 そのようなことは、十分ではないかも知れませんが検討済みです。

  • MSB6011が発生してビルドが進まない

    visual studio 2022 でVC++ のビルドをしたところ以下のエラーが発生しました。前に進めなくてこまっています。回答お待ちしております。 エラーメッセ―ジ ・要素 <SubSystem> の値 "Windows(/SUBSYSTEM:CONSOLE)" は無効です。プロジェクト名     下記ファイル ・MSB6011 Link タスクに無効なパラメーターが渡されました。プロジェクト名 下記ファイル ファイル Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets <Link SubSystem ="%(Link.SubSystem)" > <プロジェクト>→<構成プロパティ>→<C/C++>→<プリプロセッサ定義> WIN32;NDEBUG;%_Windows;(PreprocessorDefinitions) <プロジェクト>→<構成プロパティ>→<リンカー>→<システム> Windows(/SUBSYSTEM:WINDOWS よろしくお願いいたします。

  • コンパイルエラー ユーザ定義型は定義されていません。

    アクセス2003です。 とあるサンプルファイルをダウンロードしたのですが Private objDrSB(1 To 100) As DirectSoundSecondaryBuffer8 の部分が 「コンパイルエラー ユーザ定義型は定義されていません。」 となります。 参照設定のどこにチェックを入れればいいのでしょうか?