【问题标题】:Expanding a dynamic macro inside printf function在 printf 函数中扩展动态宏
【发布时间】:2016-01-14 16:32:09
【问题描述】:

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

#ifndef EXECUTABLE_NAME
#define EXECUTABLE_NAME         "defaultname"
#endif

在使用 gcc 编译时,我使用-D 开关来定义这个宏(这是正确的术语吗?):

$ gcc main.c -DEXECUTABLE_NAME="newname"

我不知道 -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);

有什么建议吗?

【问题讨论】:

    标签: c gcc macros printf


    【解决方案1】:

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

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

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

    【讨论】:

    • argv[0] 是否给出可执行文件名称,例如myapp 或类似 ./myapp 甚至 /path/to/myapp ?我只需要纯应用程序的可执行文件名
    • 试试看,它是特定于平台的。
    • 如果最后一个斜杠存在并显示它之后的字符串,这并不难。另外,如果用户以不同的名称复制您的可执行文件,它将是防复制的。
    【解决方案2】:

    我用整数试了这个程序,如下

    #ifndef EXECUTABLE_NAME
    #define EXECUTABLE_NAME 2
    #endif
    
    int main()
    {
      printf("%d",EXECUTABLE_NAME);
    }
    

    然后输入 gcc main.c -DEXECUTABLE_NAME=1 ,它会随着值更改为 1 工作。您使用的数据类型“字符串”是否有问题?

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多