Tag: 编译器构造

有没有办法让gcc或clang警告显式演员表?

我想要做的是找到所有显式的强制转换,从double类型或float到我拥有的一些源文件中的任何其他类型。 有没有内置的gcc方法来做到这一点? 语言是C.谢谢!

为什么C / C ++程序经常在调试模式下关闭优化?

在大多数C或C ++环境中,存在“调试”模式和“释放”模式编译。 看看两者之间的区别,您会发现调试模式添加了调试符号(通常是许多编译器上的-g选项),但它也会禁用大多数优化。 在“发布”模式下,您通常会启用各种优化。 为什么不同?

为什么gcc不允许将const int作为case表达式?

我正在考虑这个问题,并开始考虑const ints与#defines,并意识到我实际上并不理解为什么编译器无法解决这个问题。 有人可以解释为什么以下代码 const int FOO = 10; int main(int argc, char** argv) { switch(argc) { case FOO: { printf(“foo\n”); } default: { printf(“default\n”); } } } 结果是 error: case label does not reduce to an integer constant 我阅读了ISO-C99规范,该规范在6.8.4.2.3中说明 每个case标签的表达式应为整数常量表达式,并且同一switch语句中的两个case常量表达式在转换后不应具有相同的值。 我理解为什么case表达式必须是常量,但不是为什么只有一个文字让编译器(gcc 4.2.1)满意。

有什么区别 – 1)预处理器,链接器,2)头文件,库? 我的理解是否正确?

好的,直到今天早上我才对这些术语感到困惑。 我想我有所不同,希望如此。 首先,令人困惑的是,由于预处理器已将头文件包含在包含函数的代码中,因此链接器链接到汇编器/编译器生成的目标文件的库函数是什么? 部分混淆主要是由于我对头文件和库之间的差异的无知而产生的。 经过一段谷歌搜索和堆栈溢出(就是术语?:p),我收集到头文件主要包含函数声明,而实际的实现是在另一个称为库的二进制文件中(我仍然不是100%确定这个)。 所以,假设在以下程序中: – #include int main() { printf(“whatever”); return 0; } 预处理器在代码中包含头文件的内容。 编译器/编译器+汇编器完成其工作,然后最终链接器将此目标文件与另一个实际存储了printf()工作方式的目标文件组合在一起。 我的理解是否正确? 我可能会离开……你能帮我吗? 编辑:我一直想知道C ++ STL。 它总是让我困惑的是它究竟是什么,所有这些标题的集合或什么? 在阅读完回复之后,我可以说STL是一个目标文件/类似于目标文件的东西吗? 而且,我想在哪里可以读取函数的函数定义,如pow() , sqrt()等等。我会打开头文件,但没有找到任何东西。 那么,库中的函数定义是否是二进制不可读的forms?

-fno-strict-aliasing的性能影响

是否有任何研究或一组基准测试显示由于在GCC中指定-fno-strict-aliasing(或其他编译器中的等效项)而导致的性能下降?

静态链接ncurses到程序

我有一些问题静态地将ncurses链接到我的一个程序 这是一个非常简单的示例程序: #include int main(){ initscr(); printw(“Hello world\n”); refresh(); getch(); endwin(); return 0; } 当我用它编译它 gcc -static -lncurses hello_curses.c -o curses 我收到这些错误: /tmp/ccwHJ6o1.o: In function `main’: curses_hello.c:(.text+0x5): undefined reference to `initscr’ curses_hello.c:(.text+0x14): undefined reference to `printw’ curses_hello.c:(.text+0x1b): undefined reference to `stdscr’ curses_hello.c:(.text+0x20): undefined reference to `wrefresh’ curses_hello.c:(.text+0x27): undefined reference to `stdscr’ curses_hello.c:(.text+0x2c): undefined reference to […]

支持C11的编译器

我想知道是否有任何编译器支持相当数量的新C11标准。 寻找像Generic Selection等的function。 有什么建议?

当sizeof(char)!= 1时,C中的字节精度指针算术

如何以单字节精度可移植地执行指针运算? 请记住: char在所有平台上都不是1个字节 sizeof(void) == 1仅作为GCC中的扩展名提供 虽然某些平台可能具有指针deref指针对齐限制,但算术仍可能需要比最小基本POD类型的大小更精细的粒度

编译器如何为变量分配内存地址?

我教一门课程让学生们提出有关编程的问题(!):我有这个问题: 机器为什么选择变量进入内存? 我们可以告诉它存储变量的位置吗? 我真的不知道该说些什么。 这是我的第一次尝试: 编译器(不是机器)自动选择将变量存储在进程地址空间的位置。 使用C,我们无法告诉机器存储变量的位置。 但是“自动”有点虎头蛇尾并且引发了一个问题…而且我已经意识到我甚至不知道它是编译器,运行时或操作系统还是谁来完成任务。 也许有人能比我更好地回答学生的问题。

来自数组0初始化的奇怪组件

灵感来自c / c ++中初始化和归零数组的问题? 我决定实际检查一下针对Windows Mobile Professional(ARM处理器,来自Microsoft Optimizing Compiler)的优化发布版本的程序集。 我发现的有点令人惊讶,我想知道是否有人可以解释我的问题。 检查这两个例子: byte a[10] = { 0 }; byte b[10]; memset(b, 0, sizeof(b)); 它们在同一个函数中使用,因此堆栈如下所示: [ ] // padding byte to reach DWORD boundary [ ] // padding byte to reach DWORD boundary [ ] // b[9] (last element of b) [ ] [ ] [ ] […]