Tag: 编译器构造

(&)的地址给出了编译器生成的地址或加载器生成的地址?

int a; printf(“address is %u”, &a); 这是哪个地址..? 我的意思是这是一个编译器生成的地址,即虚拟地址或加载器给出RAM中的物理地址..? 因为它每次打印不同的地址,我想它必须是RAM中的地址。 只是想确定一下。 请提供任何参考您的答案的链接。

是否存在使用g ++ 无法正确编译有效C代码的情况

可能重复: “C ++的C子集” – >哪里没有? 例子? 我知道C是C ++的一个子集(即不存在有效的C代码,它不是有效的C ++代码)。 我的问题是g++是否与所有C代码完全兼容。 例如,将 g++ -o testing test.c 产生相同的二进制文件 gcc -o testing test.c 在所有情况下? 更具体地说,如果他们并不总是创建相同的二进制文件,那么有什么理由可能会出现问题吗? 如果我不确定代码,总是使用g++是否安全?

这个函数定义如何工作?

我几天前用gperf生成了一个哈希函数。 我看到hash函数对我来说是陌生的。 它是这样的(我不记得确切的语法): unsigned int hash(str, size) register char* str; register unsigned int size; { //Definition } 现在,当我尝试使用C ++编译器(g ++)进行编译时,由于没有声明str和size因此向我提出错误。 但这是在C编译器(gcc)上编译的。 所以,问题: 我认为C ++是C的超集。如果是这样的话,这应该用C ++编译器编译吧? C编译器如何理解定义? str和size在首次出现时未声明。 在函数签名之后但在函数体之前声明str和size的目的是什么,而不是遵循在两个地方中的任何一个中执行它的正常方法? 如何在g ++上编译此函数,以便在C ++代码中使用它? 或者我应该尝试从gperf生成C ++代码? 那可能吗?

编译成更快的代码:“n * 3”或“n +(n * 2)”?

编译成更快的代码:“ans = n * 3”或“ans = n +(n * 2)”? 假设n是int或long,它是在现代Win32 Intel盒子上运行的。 如果涉及一些解除引用,这会有所不同,也就是说,哪一个会更快? 长的; long * pn; 长的; … * pn = some_number; ans = * pn * 3; 要么 ans = * pn +(* pn * 2); 或者,它是否需要不用担心,因为优化编译器在任何情况下都可能解释这一点?

C99的支持真的还没有普及吗?

我正在阅读GNOME项目的一些最佳实践,他们一直强调的一件事是避免C99function,因为支持仍然不普遍。 他们提到的一些function是单行注释和在块中间声明变量等function。 这让我很奇怪,是C99的支持,即使对于//评论这样的基本function,还真的还没有普及吗? 自标准通过以来已经差不多15年了,我们甚至在那个时候出现了新的标准。 这真的还是个问题吗?

C / C ++编译器反馈优化

有没有人看过任何使用C / C ++编译器提供的反馈优化来支持分支预测,缓存预加载等function的程序的真实世界数字。 我搜索了它,令人惊讶的是,甚至流行的翻译开发小组似乎都没有检查过这种效果。 并且将ruby,python,php等性能提高10%左右应该被认为是有用的。 真的没有任何好处,或整个开发者社区只是懒得使用它?

C程序链接共享库而不设置LD_LIBRARY_PATH

我正在阅读GCC简介,它说如果一个软件包同时包含.a和.so。 gcc更喜欢共享库。 默认情况下,加载程序仅在预定义的一组系统目录中搜索共享库,例如/usr/local/lib和/usr/lib 。 如果库不在其中一个目录中,则必须将其添加到加载路径,或者您需要使用-static选项强制它使用.a库。 但是,我尝试了以下方法: vim hello.c: #include #include int main() { mpz_t x; mpz_init(x); return 0; } gcc hello.c -I/opt/include -L/opt/lib -lgmp (my gmp library is in opt) ./a.out 它运行。 该书说它应该有以下错误: ./a.out: error while loading shared libraries: libgdbm.so.3: cannot open shared object file: No such file or directory (好吧,这本书使用GDBM作为例子,但我使用了GMP,但这没关系吗?) 但是,我没有设置LD_LIBRARY_PATH=/opt/lib ,你可以看到我也没有使用-static选项,但a.out仍然运行。 你能告诉我为什么,并告诉我如何得到书中描述的错误? 是的,我想要错误,所以我会理解我误解的内容。

即使我们在C程序中不包含stdio.h,为什么我们不会得到编译时错误?

当我第一次没有包含任何头文件时,编译器如何知道sleep函数的原型甚至printf函数? 而且,如果我指定sleep(1,1,”xyz”)或任意数量的参数,编译器仍会编译它。 但奇怪的是gcc能够在链接时找到这个函数的定义,我不明白这是怎么回事,因为实际的sleep()函数只接受一个参数,但我们的程序提到了三个参数。 /********************************/ int main() { short int i; for(i = 0; i<5; i++) { printf("%d",i);`print("code sample");` sleep(1); } return 0; }

为什么编译器将此变量初始化为错误的值? 这是对齐问题吗?

我正在使用嵌入式C编译器(ARM cortex-m3芯片),它似乎将错误的值初始化为结构。 为什么会这样? 如果是对齐问题,编译器是否应该知道将int32u与4字节边界对齐? 注意:printf只会抛出串行端口的字节。 这个芯片上没有stdio.h实现。 typedef struct { int32u startTime; int16u length; int32u offTime; } Cycle; Cycle cycle = { 315618000, 1200, 0 }; void init() { printf(“\r\nInitialized! Cycle Start: %d”, cycle.startTime); cycle.startTime = 315618000; cycle.length = 1200; printf(” Cycle Start: %d”, cycle.startTime); } 输出:初始化! 循环开始:631237200循环开始:315618000 注意::这不是printf问题。 调试器也会将内存中的值validation为631237200。

现代操作系统/编译器,其中int(在C中)不是32位?

问题实际上有点广泛。 根据过去15年的经验,我目前假设类型的大小如下: byte = 8 bit short = 2 bytes int = 4 bytes long long = 8 bytes 是否存在可以挑战这种假设的现代操作系统?