C 在printf函数中展开动态宏

C 在printf函数中展开动态宏,c,gcc,macros,printf,C,Gcc,Macros,Printf,我想用不同的名字编译一个c程序。在主文件中,我有以下宏: #ifndef EXECUTABLE_NAME #define EXECUTABLE_NAME "defaultname" #endif 使用gcc编译时,我使用-D开关来定义此宏(这是正确的术语吗?) 我不知道-D是否正常工作,因为当我尝试执行下面的代码时…它失败了…我无法判断-D开关是否出错,或者在printf()函数中使用宏的语法是否正确: printf("no or invalid arguments. usag

我想用不同的名字编译一个c程序。在主文件中,我有以下宏:

#ifndef EXECUTABLE_NAME
#define EXECUTABLE_NAME         "defaultname"
#endif
使用gcc编译时,我使用
-D
开关来定义此宏(这是正确的术语吗?)

我不知道-D是否正常工作,因为当我尝试执行下面的代码时…它失败了…我无法判断-D开关是否出错,或者在
printf()
函数中使用宏的语法是否正确:

printf("no or invalid arguments. usage: %s [0,255]\n", EXECUTABLE_NAME);
我得到这个错误:

main.c:48:57: note: in expansion of macro ‘EXECUTABLE_NAME’
  printf("no or invalid arguments. usage: %s [0,255]\n", EXECUTABLE_NAME);

有什么建议吗?

它是有效的,因为有错误,你可以看到这一点。顺便说一下,这是因为您在命令行上定义的宏是错误的,这就是在宏中引用字符串的方式:

$ gcc main.c -DEXECUTABLE_NAME='"newname"'

也就是说,它甚至不需要。可执行路径始终是您的第一个参数:
*argv

我用一个整数尝试了这个程序,如下所示

#ifndef EXECUTABLE_NAME
#define EXECUTABLE_NAME 2
#endif

int main()
{
  printf("%d",EXECUTABLE_NAME);
}

然后键入gcc main.c-DEXECUTABLE_NAME=1,当值变为1时,它就会工作。您使用的数据类型“string”是否有问题?

argv[0]是否给出了可执行文件名,例如
myapp
或类似
/myapp
或甚至
/path/to/myapp
?我只需要纯应用程序可执行文件名试试看,它是特定于平台的。不难找到最后一个斜杠(如果存在)并在它后面显示字符串。另外,如果用户以不同的名称复制您的可执行文件,它将是防拷贝的。
#ifndef EXECUTABLE_NAME
#define EXECUTABLE_NAME 2
#endif

int main()
{
  printf("%d",EXECUTABLE_NAME);
}