我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:
#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?有没有更好的方法来做同样的事情?
我正在编写一个跨平台的代码,它应该在linux,windows,Mac OS上编译.在窗户上,我必须支持视觉工作室和mingw.
有一些特定于平台的代码,我应该放在#ifdef .. #endif
环境中.例如,这里我放置了win32特定代码:
#ifdef WIN32
#include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)
但是我如何识别linux和mac OS?我应该使用什么定义名称(或等)?
在C++函数中,如果编译64位架构,我需要编译器选择不同的块.
我知道为MSVC++和g ++做一个方法,所以我会把它作为答案发布.但是我想知道是否有更好的方法(更优雅,适用于所有编译器/所有64位架构).如果没有更好的方法,我应该寻找其他预定义的宏,以便与其他编译器/架构兼容?
在我维护的应用程序中,我们遇到了影响stdlib的文件描述符限制的问题.此问题仅影响标准库的32位版本.
我已经设计了一个修复我的代码,并希望实现它,但只有在编译32位可执行文件时.我可以#ifdef使用什么预处理器符号来确定是为32位还是64位目标编译代码?
编辑
对不起,没提,代码是跨平台,linux,windows,solaris和其他一些unix风格,大多使用GCC进行编译.我可以跨平台使用任何事实上的标准吗?
编辑2
我发现了一些似乎可能有用的定义"__ILP23"和"__LP64"... 这里的讨论解释了unix平台的背景.任何人都有使用这些定义的经验吗?这会有用吗?
可能重复:
检测CPU体系结构编译时
是否有GCC设置的定义,它告诉哪个CPU(x86/amd64/ppc/etc)配置了GCC?
所以我可以使用它:
#ifdef PPCARCH
dosomething();
#endif
Run Code Online (Sandbox Code Playgroud) 长话短说——我使用 Ted Krovetz 的实现来计算UMAC
和UMAC AE
加密 ( http://www.fastcrypto.org/ )。
当我用 编译我的代码(和/或中的测试umac.c
)时-std=c99
,计算出的结果UMAC
与预期完全不同(并且是错误的)。当我删除这个选项时,一切都像魅力一样。
有什么想法可能导致这种情况吗?我可以做什么来检查发生了什么以及什么产生了不同的结果?
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
$ uname -a
xxx 3.13.0-43-generic #72-Ubuntu SMP .. x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
我不使用任何其他选项 - 只是使用和不使用-std=c99
.
再说几句话:
我会尝试联系 Ted Krovetz 并向他询问这个问题(可能是一些错误或其他问题),但这不是重点。这个问题有点笼统,这个具体问题可以看作是一个例子。
我跑了valgrind
——没什么特别的。添加-Wall
并且-Wextra
-什么也没有了。听起来像UB,但valgrind
没有抱怨任何事情。
这种情况非常有趣,花了我很多天和头痛才明白,问题不在我的代码中(我使用这个实现来实现复杂的协议),而是在算法中,尤其是在这个选项中。所以我决定征求意见。
在 C 和 C++ 中都有效的代码在用每种语言编译时会产生不同的行为吗?根本不相关,因为我们在这里谈论的是同一种语言。
这种没有“-std=c99”的巨大 fprintf 速度差异很接近,但还不够。
编辑
这是我的测试结果和我所做的(源/标题刚刚下载,我没有更改任何内容): …
我想仅在x86和x86_64 linux上编译我的部分代码,而不是s390 linux或其他.如何在C中使用宏定义来实现呢?我知道linux的是要确定Linux操作系统,以及386,486和586,以确定CPU架构.是否有一个简单的宏定义来确定x86 linux和x86_64 linux?谢谢
在一个c
程序中,我想做不同的事情。该程序将在基于 x86/x64 的 GNU/Linux 系统以及基于 ARM 的系统上运行,例如在 PC 或 RaspberryPI 上。
GCC 中是否有预定义的宏来告诉平台?
就像是
#ifdef _X64_
/do x64 stuff
#elif _ARM_
//do arm stuff
#endif
Run Code Online (Sandbox Code Playgroud)
或者也许这是错误的方法?我将Makefile
用于编译,我可以摆脱我自己的定义。
最好/最安全的方法是什么?
在编译时,有些使用static_assert
s我想检查一些简单类型的位大小,unsigned int
或者char
,根据我的用法,它将在编译时发生重要的事情.
我在gcc
手册中没有发现任何相关内容,也没有任何相关功能的知识clang
,任何人都知道如何检查类型使用的位数?
请不要,我的重点是位和编译时间.