这与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 }
1条答案
按热度按时间qzwqbdag1#
当您用途:
不允许该独立式(0)。但是,如果您这样定义它:#define printf(格式,...)
您也可以使用命令行定义:
一切正常。