相关疑难解决方法(0)

如何使用预处理程序指令检查OS?

我需要我的代码根据编译它的操作系统做不同的事情.我正在寻找这样的东西:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?有没有更好的方法来做同样的事情?

c operating-system conditional-compilation c-preprocessor

175
推荐指数
7
解决办法
13万
查看次数

如何从预处理器宏中识别平台/编译器?

我正在编写一个跨平台的代码,它应该在linux,windows,Mac OS上编译.在窗户上,我必须支持视觉工作室和mingw.

有一些特定于平台的代码,我应该放在#ifdef .. #endif环境中.例如,这里我放置了win32特定代码:

#ifdef WIN32
#include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)

但是我如何识别linux和mac OS?我应该使用什么定义名称(或等)?

c++ macros cross-platform c-preprocessor

112
推荐指数
4
解决办法
10万
查看次数

如何检测我是否正在使用C++编译64位架构

在C++函数中,如果编译64位架构,我需要编译器选择不同的块.

我知道为MSVC++和g ++做一个方法,所以我会把它作为答案发布.但是我想知道是否有更好的方法(更优雅,适用于所有编译器/所有64位架构).如果没有更好的方法,我应该寻找其他预定义的宏,以便与其他编译器/架构兼容?

c++ 64-bit c-preprocessor

21
推荐指数
4
解决办法
2万
查看次数

#ifdef用于32位平台

在我维护的应用程序中,我们遇到了影响stdlib的文件描述符限制的问题.此问题仅影响标准库的32位版本.

我已经设计了一个修复我的代码,并希望实现它,但只有在编译32位可执行文件时.我可以#ifdef使用什么预处理器符号来确定是为32位还是64位目标编译代码?

编辑

对不起,没提,代码是跨平台,linux,windows,solaris和其他一些unix风格,大多使用GCC进行编译.我可以跨平台使用任何事实上的标准吗?

编辑2

我发现了一些似乎可能有用的定义"__ILP23"和"__LP64"... 这里的讨论解释了unix平台的背景.任何人都有使用这些定义的经验吗?这会有用吗?

c c++ 64-bit gcc 32-bit

21
推荐指数
5
解决办法
3万
查看次数

检测GCC配置的目标CPU是什么?

可能重复:
检测CPU体系结构编译时

是否有GCC设置的定义,它告诉哪个CPU(x86/amd64/ppc/etc)配置了GCC?

所以我可以使用它:

#ifdef PPCARCH
  dosomething();
#endif
Run Code Online (Sandbox Code Playgroud)

gcc c-preprocessor

5
推荐指数
1
解决办法
2493
查看次数

带和不带 -std=c99 的代码会产生不同的结果(UMAC AE 实现)

长话短说——我使用 Ted Krovetz 的实现来计算UMACUMAC 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 速度差异很接近,但还不够。


编辑

这是我的测试结果和我所做的(源/标题刚刚下载,我没有更改任何内容): …

c gcc c99 compiler-options

4
推荐指数
1
解决办法
353
查看次数

如何在gcc的编译时识别x86与x86_64?

我想仅在x86和x86_64 linux上编译我的部分代码,而不是s390 linux或其他.如何在C中使用宏定义来实现呢?我知道linux的是要确定Linux操作系统,以及386,486586,以确定CPU架构.是否有一个简单的宏定义来确定x86 linux和x86_64 linux?谢谢

c linux macros

4
推荐指数
2
解决办法
4284
查看次数

如何判断程序是在 x86/x64 还是 ARM 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用于编译,我可以摆脱我自己的定义。

最好/最安全的方法是什么?

c linux gcc makefile

3
推荐指数
1
解决办法
2683
查看次数

Gcc扩展或宏,用于在编译时检查用于某些基本类型的位

在编译时,有些使用static_asserts我想检查一些简单类型的位大小,unsigned int或者char,根据我的用法,它将在编译时发生重要的事情.

我在gcc手册中没有发现任何相关内容,也没有任何相关功能的知识clang,任何人都知道如何检查类型使用的位数?

请不要,我的重点是和编译时间.

c c++ gcc clang

-7
推荐指数
1
解决办法
126
查看次数