- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚开始学习 C,我不确定一切是如何工作的。有些例子对我来说看起来很奇怪,我无法预测它会打印什么。我在 GCC 中编程,我的意思是它是我的编译器,所以我测试的每个代码都在 GCC 中。
我理解指针等所有东西是如何工作的,而且你也知道有宏。宏很奇怪,我发现了一个我没有解释的例子。例如看这段代码特定的代码:
#include <stdio.h>
int main(void){
#define A 1
if(A == 0){
#define B 1
}
#ifdef B
printf("B is defined, which means that A == 0.\n");
#elif
printf("B isn't defined, which means that A == 1.\n");
#endif
printf("Value of A is %d\n", A);
return 0;
}
它应该打印什么?好吧,我虽然很容易猜到,但现在我发现这并不容易。结果不是我想的那样。
这是我的推理:我们首先定义 A
为 1
然后如果 A
为 0
那么定义 B
为 1
。因此,如果定义了 B
,则意味着 A == 0
,否则 A == 1
。但是,令人惊讶的是它打印出:
B is defined, which means that A == 0.
Value of A is 1
什么?它只是打印了一个矛盾。我不确定这在 GCC 中是否有些奇怪(因为我没有 visual studio 或其他编译器来测试它)。但是,我 99% 确定我以某种方式误解了宏。我尝试使用变量而不是宏,它工作正常。
这是个问题,还是我只是误解了宏的工作原理?请记住,我是 C 初学者,所以放轻松 :)。
提前谢谢你。
最佳答案
宏是代码实际编译之前的预处理器的一部分。编译器将搜索所有预处理器指令的代码并相应地修改代码。因此,当编译器到达 if(A == 0) {#define B 1}
时,它已经扩展为 if(0 == 1) { }
。
宏可以轻松配置代码的某个方面或将魔数(Magic Number)替换为有意义的定义。例如:
#define DO_HOUR_CALCULATION
#define NUMBER_OF_SECONDS_PER_MINUTE (60)
#define NUMBER_OF_SECONDS_PER_HOUR (NUMBER_OF_SECONDS_PER_MINUTE * 60)
...
#ifdef DO_HOUR_CALCULATION
int hours = time / NUMBER_OF_SECONDS_PER_HOUR;
int minutes = (time % NUMBER_OF_SECONDS_PER_HOUR) / NUMBER_OF_SECONDS_PER_MINUTE;
#endif // defined(DO_TIME_CALCULATION)
另一个用途是简化重复或可配置的任务:
#define DEBUG
#ifdef DEBUG
#define DPRINTF(fmt, args...) printf(fmt, ## args)
#else
#define DPRINTF(args...) do {} while (0)
#endif
...
ret = read(fd, p_buffer, buf_size);
DPRINTF("read(fd) returned %d\n", ret);
希望这对您有所帮助,祝您编码愉快!
关于C - 宏观矛盾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44377855/
在 Coq 中,我有两个假设 H 和 H0 ,它们相互矛盾。问题是,它们只是在某些特化方面相互矛盾,而在证明的这一刻,上下文并不是那么特化。 此时我的证明上下文如下所示: color : Vertex
根据 RubyMonk section 8.1模块只保存行为而不保存状态,类可以保存行为和状态。 然而,模块是 Ruby 中类的父类(super class)。怎么会这样? 最佳答案 哦兄弟,如果你忘
来自此处的文档:http://facebook.github.io/react/docs/pure-render-mixin.html 脚注说如果复杂数据(深层数据结构)的结构发生变化,你应该使用fo
我有一个简单的类(class) function TrueNinja() { this.vanish = function() { return this; }; } 由此创建一个新对象 var
这个问题在这里已经有了答案: How do Python's any and all functions work? (10 个答案) 关闭 4 年前。 无意中发现了Numpy中的一些东西,实在看不
这个问题在这里已经有了答案: C++ doesn't tell you the size of a dynamic array. But why? (7 个回答) 关闭3年前。 我到处都读到,在 C+
编辑以提供完整的代码示例和特定问题 我正在编写一个函数来生成股票价格的时间序列图。但是,出现以下错误 eval(expr,envir,enclos)中的错误:找不到对象'df1234' 这是该函数的示
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在阅读 Stroustrup 的 C++(1997 年第 3 版)以了解他是如何实现 RAII 的,在第 365 页上我发现了这一点: class File_ptr{ FILE* p; p
A class S is a standard-layout class if it: [class.prop]/(3.7) : has no element of the set M(S) of t
我是一名优秀的程序员,十分优秀!