【问题标题】:C program to find current file nameC程序查找当前文件名
【发布时间】:2012-12-03 15:29:03
【问题描述】:

我想使用 C 程序显示我当前的 C 文件。我知道可以通过argv[0]获取可执行文件名。但我希望文件名为 'hello.c' 例如。有可能吗?

【问题讨论】:

  • 无论源代码所在的.c如何,您都可以随意命名可执行文件。

标签: c file


【解决方案1】:

一个程序可以由几个 C 文件组成。那你要找哪一个?

__FILE__ 宏就是为此而制作的。它被预处理器替换为当前正在编译的源 (.C) 文件的名称。

ma​​in.c

#include <stdio.h>
int main(int argc, char** argv)
{
    printf("Executable name: %s\n", argv[0]);

    printf("This is %s() from %s, line %d\n",
        __FUNCTION__, __FILE__, __LINE__);

    one();

    return 0;
}

one.c

#include <stdio.h>
void one(void)
{
    printf("This is %s() from %s, line %d\n",
        __FUNCTION__, __FILE__, __LINE__);
}

输出(假设可执行文件名为“hello.exe”):

Executable name: hello.exe
This is main() from main.c, line 4
This is one() from one.c, line 3

另见:

【讨论】:

  • 我应该为 FILE 使用什么头文件,先生?我在linux上。
  • 你的意思是__FILE__?没有。同样,这些宏由 预处理器 定义(在实际编译器之前运行)。它们不是由任何头文件定义的。
  • 但是,当我使用它时,它说 FILE 未声明。我在linux上。
  • 再一次,你是说FILE - 你的意思是__FILE__ 有两个前导和尾随下划线吗?我知道你在linux上。你用的是什么编译器?海合会?
  • @JonathonReinhart - 很好的答案。顺便说一句 printf("This is %s() from %s, line %d\n", FUNCTION, FILE, LINE)产生很好的运行时错误消息。毫无疑问,什么是失败的,它在哪里。
【解决方案2】:

如果您使用的是 Windows,并且您的程序具有 ".exe" 扩展名,则将该扩展名替换为 ".c"。如果您使用的是 Linux 或 OSX,则只需附加 ".c",但不要直接附加到 argv[0],因为该字符串不会为此分配空间。而是创建一个新字符串。

然而,这并不适用于所有情况,因为实际的源文件和可执行文件当然可能有不同的命名,而且可执行文件甚至可能与源文件不在同一个文件夹中。可以使用__FILE__ 宏来获取源文件的实际名称。如果您使用的是 VisualC++,那么您可以向编译器添加一个标志,告诉它在 __FILE__ 宏中使用完整路径,请参阅 this MSDN reference。 GCC 预处理器已经在__FILE__ 中拥有完整路径,请参阅the documentation

【讨论】:

  • 假设可执行文件与 C 源文件命名相同。
  • -1 gcc myprogram.c -o differentname --> "differentname.c" 我不明白为什么建议这是个好主意。
  • 是的,我有 - 但你的第一段做出了一个疯狂的假设,即使是 OP 也没有做出。
  • @AlexeiLevenkov 我应该为 FILE 使用什么头文件,先生?我在 linux(C 程序)上。
  • @Gomathi 请注意下划线,它是__FILE__。并且不需要头文件,它是在编译器正确之前处理源代码的预处理器的一部分。另请参阅我的第二个链接,了解您可以使用的其他宏。
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2023-03-12
  • 2017-09-23
  • 2020-11-21
相关资源
最近更新 更多