- 1. 概要
- 2. 状況
- 3. 工夫
- 4. 参考サイト
1. 概要
どうも、「__FILE__」というシンボルの使い方が、「C」と「C++」で出力結果が異なるという話なのですが。
2. 状況
純粋な「C言語」であれば。
printf("%s", __FILE__);
と書けば、コンパイラがプリプロセッサの解釈のタイミングで、ソースファイル名を拡張子付きで文字列化してくれます。
しかし、いくつかの「C++」のコンパイラでは、「__FILE__」は、ディレクトリつきになり、ファイル名のみで使いたい場合は、「__FILE_NAME__」を使用するらしい。
ところが、わたしの持っている環境では、「clang」も「gcc」も思い通りにならない。
3. 工夫
「Gemini」伍長と相談して、以下の工夫をしました。
file.cpp
という、ファイルを作成しまして、中に以下を記述します。
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("%s\n", __FILE__);
printf("%s\n", __FILE_NAME__);
return 0;
}
「clang」を例にしますと。
これを。
clang++ file.cpp
で作成したロードモジュールを実行しても。
file.cpp
file.cpp
と出力されるので、検証にならない。
コンパイルオプションをちょっと変えます。
clang++ $(realpath file.cpp)
こうして作成した、ロードモジュールを実行すると。
/home/hogehoge/lang/cpp/sample/file.cpp
file.cpp
となりまして、実証できました。
「__FILE__」で、パスなしのファイ名のみにする工夫が、参考サイトに書いてあるのですが。
面倒なので、「__FILE_NAME__」を使うようにするべきかと思います。
4. 参考サイト
本ページは、下記のサイトおよび「Gemini」伍長を参考にさせていただきました。
「__FILE__ からディレクトリ名を削除する方法」
|
|