【问题标题】:printf defined as voidprintf 定义为 void
【发布时间】:2012-03-18 05:11:57
【问题描述】:

我想出了一种方法,可以在阅读 C-FAQs 的同时同时让所有 printfs 静音。

你能告诉我这是如何工作的吗?程序:

#include<stdio.h>

//How to silence all printfs at once!!!

#define printf (void) 

#define ab a b c d e f
#define xstr(a) str(a)
#define str(a) #a

#define string "The politicians do not even know the" xstr(ab) "of politics"

main(){

char *all=str(a b c d e f);

printf("%s\n",all);
printf(string);

}

程序的输出为空白。我的意思是它根本不打印任何东西。如果我#define printf 为:

/ #define printf  

这也是同样的行为。我不明白 GCC 在这两种情况下是如何编译调用的。绝对没有错误和警告。

  • 第一种情况printf 变为:(void)("%s\n",all);
  • 第二种情况printf变成:("%s\n",all);

【问题讨论】:

  • 第二个printf变成(void)("The politicians do not even know the" "a b c d e f" "of politics");
  • 是的,不知何故错过了。对不起。刚刚用 -E 选项编译并看到了:)

标签: c printf void


【解决方案1】:

C 有一个comma operator,表示两个表达式都有效。

【讨论】:

  • 谢谢,我从来没有强调逗号操作符。这是一个很好的例子。再次感谢。
  • 请注意,实际上检查 printf() 的返回值的代码在任何一种情况下都会开始表现得很奇怪。
  • 实际上,第一个很有可能根本无法编译——编译器将无法将void 表达式转换为任何可测试的表达式。
  • 它编译得很好。两种情况。
  • 只是因为没有使用返回值。
【解决方案2】:

预处理器将函数替换为空格或 void,这就是它在运行时不被调用的原因。

【讨论】:

  • 他知道。他在问题“第一种情况下变成 XYZ”ezc 的最后一句写道。
【解决方案3】:

当它发生时,它会编译成一个括号表达式,它什么也不做,并返回其最后一个元素的值(用逗号分隔 - 这是 C 的逗号运算符,您有时可以在循环条件中看到)。即使您不将其强制转换为 void,大多数编译器中的默认设置也不会警告忽略的非 void 返回值,因此可以正常编译。

【讨论】:

  • 我一直认为强制转换运算符不是左值。它基本上不能放在表达式的左侧。你会怎么解释这个?
  • 什么?我什至不明白你的问题......怎么样 *(int *)ptr = 3;而且,您要投射的值并没有被分配到,它们就在那里。
  • 哦,对不起,我在想 (int *)ptr=3 的行,现在我明白了。
  • 你能告诉我我的理解是否正确,*(int *)prt=3 有效而 (int *)ptr=3 无效,因为在第一种情况下,由 (int *)ptr 被提供给 deference 运算符,使其成为左值。
猜你喜欢
  • 2014-09-12
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2023-03-25
  • 2019-12-02
相关资源
最近更新 更多