gcc使用printf-D参数定义类似函数的宏

yv5phkfx  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(173)

这与GCC define function-like macros using -D argument非常相似,但我找不到与我的用例的关系。
请考虑以下代码main.c

#include <stdio.h>

const char greeting[] = "hello world";

//#define printf(fmt, ...) (0)

int main() {
    printf("%s!\n", greeting);
    return 0;
}

如果我编译并运行它,它将按预期工作:

$ gcc -Wall -g main.c -o main.exe
$ ./main.exe
hello world!
$

好了,现在我想要How to disable printf function?,所以我取消注解代码中的#define;我收到了一些警告,但一切又如预期一样正常(因为没有打印输出):

$ gcc -Wall -g main.c -o main.exe
main.c: In function 'main':
main.c:5:26: warning: statement with no effect [-Wunused-value]
    5 | #define printf(fmt, ...) (0)
      |                          ^
main.c:8:5: note: in expansion of macro 'printf'
    8 |     printf("%s!\n", greeting);
      |     ^~~~~~
$ ./main.exe
$

现在,回到最初发布的示例--也就是说,注解#define,类似于--让我们尝试通过命令行-D参数设置该定义:

$ gcc -Wall -D'printf(fmt, ...)=(0)' -g main.c -o main.exe
<command-line>: error: expected identifier or '(' before numeric constant
main.c: In function 'main':
<command-line>: warning: statement with no effect [-Wunused-value]
main.c:8:5: note: in expansion of macro 'printf'
    8 |     printf("%s!\n", greeting);
      |     ^~~~~~

命令行参数-D'printf(fmt, ...)=(0)'会导致编译失败。
有没有什么方法可以格式化这个宏,这样我就可以通过gcc命令行使用-D参数来设置它?(额外好处:是否可以以某种方式对其进行公式化,以使其不会引发“语句无效”之类的警告)
编辑:第366至372行的内容:

366 __mingw_ovr
    367 __attribute__((__format__ (gnu_printf, 1, 2))) __MINGW_ATTRIB_NONNULL(1)
    368 int printf (const char *__format, ...)
    369 {
    370   int __retval;
    371   __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
    372   __retval = __mingw_vfprintf( stdout, __format, __local_argv );
    373   __builtin_va_end( __local_argv );
    374   return __retval;
    375 }
qzwqbdag

qzwqbdag1#

当您用途:

#define printf(fmt, ...) (0)

The preprocessor turns the code into this:
int main() {
    (0);
    return 0;
}

不允许该独立式(0)。但是,如果您这样定义它:#define printf(格式,...)
您也可以使用命令行定义:

"-Dprintf(fmt, ...)="

一切正常。

相关问题