Tag: 编译器构造

无意中使用=而不是==

看起来 if (x=y) { …. } 代替 if (x==y) { … } 是许多邪恶的根源。 为什么并非所有编译器都将其标记为错误而不是可配置警告? 我有兴趣找出构造if (x=y)有用的情况。

奇怪的数组初始化表达式?

以下代码是什么意思? 代码来自GCC的回归测试套件。 static char * name[] = { [0x80000000] = “bar” };

从零开始的数字有什么特别之处?

这有点愚蠢的问题,但对我来说很有意思) 这就是我在visual studio 2013中获得的 int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow ) int i = 08; // compile error, compiler expects octal number… 如果number从零开始并且包含8,那就是编译错误。 这是正常的吗? 如果00016 == 14,那么编译器在启动零时究竟做了什么? […]

当C / C ++中的数字常量以0为前缀时,这意味着什么?

好的…所以我有一个愚蠢的想法,并尝试将值0123放入一个int,只是好奇看看会发生什么,我假设当我打印的值我得到123,但我得到83 …有什么想法吗? 在编译器/内存中发生什么使得该值变为83? 我在C ++和C中使用GCC编译器尝试了这个,并尝试使用浮点数产生相同的结果。

为什么需要前瞻性声明?

可能重复: C ++应该消除头文件吗? 在像C#和Java这样的语言中,没有必要在使用它之前声明(例如)一个类。 如果我理解正确,这是因为编译器对代码进行了两次传递。 在第一个中它只是“收集可用信息”,在第二个中它检查代码是否正确。 在C和C ++中,编译器只进行一次传递,因此当时所有东西都需要可用。 所以我的问题基本上就是为什么不用C和C ++这样做。 它不会消除头文件的需求吗?

在C / C ++中理解函数调用的堆栈框架?

我是C / C ++和汇编语言的新手。 这也可能是一个非常基本的问题。 我试图理解堆栈帧是如何构建的以及哪些变量(params)按什么顺序被推送到堆栈? 一些搜索结果显示…. C / C ++的编译器基于函数内执行的操作来决定。 例如,如果函数假设只是将传递的int参数的值递增1并返回(类似于++运算符),它会将函数和局部变量的所有函数和局部变量放在寄存器中并执行加法。 …想知道哪个寄存器用于返回/传递值?….如何返回引用? …..差异b / w eax,ebx,ecx和edx。 在函数调用期间使用/构建和销毁请求书籍/博客/链接或任何类型的材料来理解寄存器,堆栈和堆引用……以及如何存储主函数? 提前致谢

静态变量存储在C和C ++中的哪个位置?

在可执行文件的哪个段(.BSS,.DATA,其他)中存储了静态变量,以便它们没有名称冲突? 例如: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf(“%d,%d”, foo, bar); printf(“%d, %d”, foo, bar); } } 如果我编译这两个文件并将其链接到重复调用fooTest()和barTest的main,则printf语句将独立增加。 有意义,因为foo和bar变量是翻译单元的本地变量。 但是存储分配在哪里? 需要明确的是,假设您有一个工具链可以输出ELF格式的文件。 因此,我认为在可执行文件中必须为这些静态变量保留一些空间。 出于讨论目的,我们假设我们使用GCC工具链。