Tag: 编译器构造

-Werror = format:编译器如何知道

我写了这个故意错误的代码 printf(“%d %d”, 1); 使用g++和-Werror=format编译。 编译器给出了令人印象深刻的警告: error: format ‘%d’ expects a matching ‘int’ argument [-Werror=format] 据我所知,编译器无法判断代码是错误的,因为格式字符串直到运行时才被解析。 我的问题:编译器是否有一个特殊的function,可以用于printf和类似的libc函数,或者这是我可以用于我自己的函数的一个特性? 字符串文字?

math.h ceil在C中没有按预期工作

为什么ceil()会在没有分数部分的情况下进行均匀浮动? 当我尝试这样做时: double x = 2.22; x *= 100; //which becomes 222.00… printf(“%lf”, ceil(x)); //prints 223.00… (?) 但是当我将2.22的值更改为2.21时 x *= 100; //which becomes 221.00… printf(“%lf”, ceil(x)); //prints 221.00… as expected 我尝试用另一种方式使用modf()并遇到另一个奇怪的事情: double x = 2.22 * 100; double num, fraction; fraction = modf(x, &num); if(fraction > 0) num += 1; //goes inside here even when […]

来自同一个库的两个函数:为什么一个生成未定义的引用而另一个不生成?

我想在函数中用pthread_mutex_trylock替换pthread_mutex_lock,当我这样做时,我得到“未定义的引用”错误消息(见下文)。 如果我用pthread_mutex_lock(&cmd_queue_lock)替换411-13行,我就不会收到链接器错误。 它们都来自我已经包含的同一个库。 为什么一个生成链接器错误而另一个不生成? 更重要的是,我该如何解决? 我尝试添加“extern int pthread_mutex_trylock”并更改Makefile中的.o文件的顺序,但两者都不起作用。 $ nl clientmain.c 12 #include … 21 #include 411 if (pthread_mutex_trylock(&cmd_queue_lock) == EBUSY) { 412 continue; 413 } $ make clientmain.o: In function `createHC’: clientmain.c:411: undefined reference to `pthread_mutex_trylock’ collect2: ld returned 1 exit status make: *** [clientmain] Error 1

为什么 – GCC中的-freciprocal-math不安全?

GCC中的-freciprocal-math更改以下代码 double a = b / c; 至 double tmp = 1/c; double a = b * tmp; 在GCC手册中,据说这种优化是不安全的,并且不符合IEEE标准。 但我想不出一个例子。 你能举个例子吗?

无限循环条件变量是否应始终声明为volatile?

考虑一下这种类型的代码, while( !cond ) ; 如果cond未声明为volatile,则编译器可以通过将其缓存在寄存器中来优化它。 在这种情况下,即使在设置cond后,while循环也将继续。 现在这是否意味着任何此类变量应始终声明为volatile ? 为什么编译器不够聪明才能意识到它不应该缓存这些变量?

C / C ++中的80位浮点运算

假设a, b是_int64变量。 需要在高精度80位浮点中计算sqrt((long double)a)*sqrt((long double)b) 。 例。 (__int64)(sqrt((long double)a)*sqrt((long double)a) + 0.5) != a在很多情况下应该是。 哪个win32 C / C ++编译器可以管理80位浮点运算?

目标c – 导入.m和.h文件 – 它做了什么

在目标c中,当你说#import“MyClass.h”时实际发生了什么? (编译器是否为您复制了什么?) 在MyClass.m文件中,如果我#import “UsefulClass.h” ,这意味着UsefulClass在此文件下可用,我可以创建对象并将消息发送到它的实例。 在myClass.m文件中,我必须#import “MyClass.h” ,这听起来像是将我的实现文件链接到它的标题(称为基本文件?),这与第一个文件的作用完全不同。 那么#import会根据具体情况做两种不同的事情吗? 或者从另一个角度来看它实际上属于一个类别。 .m文件中定义但不在.h文件中定义的方法被视为私有。 从另一个类,我可以以某种方式调用私有方法吗? (比如我#import .m而不是.h?所以类会知道实现文件定义的内容。) objective-c #import和c #include什么区别? 另外@interface MyClass : NSObject在.h文件中使用@interface MyClass : NSObject ,在.m文件中使用@interface MyClass() 。 当你想拥有私有属性时,它只是一种语法格式(如括号)吗? 或者这背后有什么逻辑吗?

链接c项目时,体系结构x86_64的未定义符号

我尝试将picoc项目编译成xcode。 没有外部库,只是我在命令行工具C项目中导入的.c和.h文件。 所有.c文件编译都没有问题,但是当XCode链接时,我收到以下消息: Undefined symbols for architecture x86_64: “_BasicIOInit”, referenced from: _PicocInitialise in platform.o “_CStdOut”, referenced from: _PrintSourceTextErrorLine in platform.o _PlatformVPrintf in platform.o “_MathFunctions”, referenced from: _IncludeInit in include.o “_MathSetupFunc”, referenced from: _IncludeInit in include.o “_PicocPlatformScanFile”, referenced from: _IncludeFile in include.o … 给出错误的命令如下: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -v -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ MacOSX10.8.sdk -L / Users / laurent […]

在C到MIPS程序集中编译代码

我写了一个C程序,我需要在MIPS汇编代码中看到它。 如何安装或运行将* .c文件作为* .txt或* .something_else以查看其MIPS汇编代码的软件? 我的操作系统是Linux。 非常感谢 !! BTW我的代码是: #include #include #include #define SIZE 128 int main () { char mychar , string [SIZE]; int i; int count =0 ; printf (“Please enter your string: \n\n”); fgets (string, SIZE, stdin); printf (“Please enter char to find: “); mychar = getchar(); for (i=0 ; string[i] != […]

C / C ++解析器如何工作?

我花了很多时间研究PHP的解析器是如何工作的: 它将PHP代码转换为最终的c代码。 但是如何将c代码翻译成可执行文件? 顺便说一句,如何判断语言A是否可以从数学方面转换为语言B?