我正在用 C 编写一个程序,我希望它能够检测自己的名称。我会解释一下:
我希望它根据其名称执行特定操作。让我们说:
if (!strcmp(myName, "Program1"))
printf("I am program 1!");
else
printf("I am someone else !");
此代码包含在 Program1.c 中,并使用以下命令进行编译:
gcc Program1.c -o Program1
我会用以下命令执行它:
./Program1
但是我无法找到允许我获取值“Program1”(可执行文件的名称)的代码,该值将是我给出的代码中的变量 myName。
有人可以帮我吗?
最佳答案
默认情况下,gcc 的输出名称不会存储在文件中的任何位置,并且我不知道如何将其注入(inject)到二进制文件中。但这是你真正想要的吗?
程序被调用的名称可以作为argv[0]
使用。如果可执行文件在编译后被重命名,情况可能会有所不同。
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("My name is %s\n", argv[0]);
return 0;
}
参数 0 由调用程序选择。它可以是带有目录信息的完整路径(这通常取决于调用者是否执行 PATH 查找或从显式位置调用可执行文件),因此如果您想基于此进行操作,您可能应该删除路径信息(例如使用 basename
(在 Unix/POSIX 平台上)。
参数 0 由调用者选择,因此这是一个约定问题。但这是一个几乎普遍遵循的约定,除非调用者有充分的理由不遵守它。大多数平台都有一种方法来定位可执行文件。例如,在 Linux 上,/proc/self/exe
是可执行文件的符号链接(symbolic link)。但在大多数情况下,如果调用者传递不同的名称,则意味着调用者希望您的程序以该不同的名称运行,因此您应该使用 argv[0]
。
argc
为 0),argv[0]
可以为 NULL。这种情况很少见,但为了鲁棒性,您的程序在这种情况下应该做一些明智的事情。
关于c - 如何获取gcc编译后执行的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873745/