LoginSignup
FumFumFumble
@FumFumFumble

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Visual C++で__FILE_NAME__を実現したい

Visual C++で__FILE_NAME__を実現したい。(gccとかclangのパスのない__FILE__)

プロジェクトの設定のプリプロセッサの定義で
__FILE_NAME__=""%(FileName)%(Extension)""
を設定すれば、シンボルは定義でき概ね望んだとおりになるのですが、プリコンパイル済みヘッダに__FILE_NAME__が"stdafx.cpp"として出力されてしまうため再定義警告が出てしまう。

そこでstdafx.cppの設定の指定したプリプロセッサ定義の無効化に__FILE_NAME__を指定すると、再定義警告は消えるが、/Dより/Uが優先される旨の警告が出力されてしまう。

この警告はプリプロセッサ警告なので#pragma warningで消せない。
(コンパイル警告の再定義は消せると思うが、消してはいけないレベルの警告なので・・・)

もしかすると今時のVC++には__FILE_NAME__あるかもしれませんが、使用しているのは古いものです。

前提
・__FILE_NAME__=""%(FileName)%(Extension)""を個々のソースに定義するのは手間というか漏れる可能性があるので避けたい。
・stdafx.cppのコンパイル設定はそもそも他と違っているのであるていどは変更しても良いと思う。
・でもstdafx.cppのコンパイル設定のプリプロセッサの定義を継承しないのはどうかとも思う。
・プリコンパイル済みヘッダを使用しないというのも避けたい。

何か手はないでしょうか。

0

2Answer

「Visual C++ __FILE_NAME__」

でググっただけですが、下記の「MSVCの場合」は参考になりませんか?

0Like

Comments

  1. @FumFumFumble

    Questioner

    既存を書き換えるのではなく、新たに追加したいのです。:relaxed:

  2. MSVC++ ほぼ使ったことがないので、詳しくは分かりませんが、

    ここを読むと、ファイル名が標準で、フルパス表示にするなら/FCオプションが必要と。
    /FCのリンクを辿ると、/ZIオプションを指定すると/FCが暗黙指定されるとあるので、
    デバッグコンパイルの場合の、/ZIオプションをやめれば回避できるのでは?

別なアプローチとして、

__FILE_NAME__の実態が関数でも良いなら、

#define __FILE_NAME__ XXX(__FILE__)
inline String XXX(String& fullpath) {
 return fullpathから最後のパスだけを抜き出す
}

を、一番共通なヘッダファイルに1つ宣言すれば、機能としては実現できると思います。
コードを書く側(__FILE_NAME__使用者)から見れば、マクロで隠蔽されているので、違いを気にする必要は無いはずです。

0Like

Your answer might help someone💌