相关疑难解决方法(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万
查看次数

在Windows和Linux上进行C++编译:ifdef switch

我想在Linux和Windows上运行一些c ++代码.有些代码我只希望包含在一个操作系统中,而不包含在另一个操作系统中.是否有标准的#ifdef可以使用?

就像是:

  #ifdef LINUX_KEY_WORD
    ... // linux code goes here.
  #elif WINDOWS_KEY_WORD
    ... // windows code goes here.
  #else 
  #error "OS not supported!"
  #endif
Run Code Online (Sandbox Code Playgroud)

问题确实是重复的,但这里的答案要好得多,尤其是被接受的答案.

c++ linux windows conditional-compilation ifdefine

161
推荐指数
6
解决办法
17万
查看次数

用C,C++检测Windows或Linux

我正在编写一个跨平台程序.我希望这个程序在Windows和Linux下运行,所以我有两个不同的代码段用于这两个平台.如果操作系统是Windows,我想要运行第一个代码段; 如果它是Linux,那么我希望第二个代码段运行.

所以我编写了以下代码,但在Windows和Linux上构建时都会出错.我该怎么做才能解决它?

#ifdef __unix__                    /* __unix__ is usually defined by compilers targeting Unix systems */

    #define OS_Windows 0
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

#elif defined(_WIN32) || defined(WIN32)     /* _Win32 is usually defined by compilers targeting 32 or   64 bit Windows systems */

    #define OS_Windows 1
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    #define DIV 1048576
    #define WIDTH 7

#endif

int main(int argc, char *argv[])
{
    if(OS_Windows)
    {
        MEMORYSTATUSEX statex;
        statex.dwLength = sizeof (statex);
        GlobalMemoryStatusEx (&statex);

        _tprintf (TEXT("There …
Run Code Online (Sandbox Code Playgroud)

c c++ linux windows

47
推荐指数
4
解决办法
7万
查看次数

用于C++的跨平台休眠功能

是否可以使用宏来制作跨平台的睡眠代码?例如

#ifdef LINUX
#include <header_for_linux_sleep_function.h>
#endif
#ifdef WINDOWS
#include <header_for_windows_sleep_function.h>
#endif
...
Sleep(miliseconds);
...
Run Code Online (Sandbox Code Playgroud)

c++ sleep cross-platform

36
推荐指数
5
解决办法
4万
查看次数

c ++ #ifdef Mac OS X问题

我是C++的新手.我目前正在开展一个小组项目,我们希望我们的课程兼容实验室计算机(Windows)和我的计算机(Mac OS X).

以下是我们在文件顶部放置的内容:

#ifdef TARGET_OS_X
#    include <GLUT/glut.h>
#    include <OpenGL/OpenGL.h>
#elif defined _WIN32 || defined _WIN64
#    include <GL\glut.h>
#endif
Run Code Online (Sandbox Code Playgroud)

我意识到之前已经问过这个问题,但是我的搜索给了我相互矛盾的答案,例如"_MAC","TARGET_MAC_OS","MACINTOSH"等.在#ifdef语句中输入的当前和正确的声明是什么兼容Mac?现在它不起作用.

谢谢!

c++ macos compatibility conditional-compilation

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

警告:紧急:为watchOS模拟器构建,但链接为iOS构建的目标文件

在集成我的j2objc转换的java库时,我收到了这条消息.

ld:警告:紧急:为watchOS模拟器构建,但链接在为iOS构建的目标文件(/Users/admin/Documents/j2objc/dist/lib/libjre_emul.a(IOSArray.o))中.注意:将来这将是一个错误.

我不明白我的代码是否适用于真正的watchOS设备?或者这只是一个仅在模拟器中运行的i386构建?在这种情况下我需要做什么?

objective-c ios j2objc watchos-2 watchos-simulator

11
推荐指数
0
解决办法
540
查看次数

OS X目标的预处理器宏?

我有一个既有iOS又有OS X目标的项目.在编译OS X时是否有预处理器宏?我试过这个:

#if TARGET_OS_MAC
@interface BFNode : NSObject <NSPasteboardReading, NSPasteboardWriting> {
#else
@interface BFNode : NSObject {
#endif
Run Code Online (Sandbox Code Playgroud)

TARGET_OS_MAC似乎没有用.当我尝试在iOS上运行应用程序时,我遇到编译器错误,因为它尝试编译第一行,并且NSPasteboardReading在iOS上没有定义协议.

我知道也有TARGET_OS_IPHONE.如果我使用它并交换@interface它起作用的声明.

但是有很多地方我有代码,没有iOS版本,所以我也需要OS X的宏.

解:

我最终在.pch文件中定义了一个新的宏:

#define TARGET_OSX TARGET_OS_IPHONE == 0
Run Code Online (Sandbox Code Playgroud)

macos xcode cocoa objective-c ios

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

使用C/C++代码识别平台linux或windows

我在接受采访时被问到,如何通过提供可运行的C代码来识别平台?

代码必须在两个平台上都可以运行(即没有用于检查的特殊头文件函数)?

c c++ linux windows

9
推荐指数
2
解决办法
3134
查看次数

如何检查当前的操作系统是Windows,Linux还是OSX?

我正在编写一个编译器项目,它将生成汇编代码作为目标语言.但是,根据操作系统的不同,需要考虑一些小的变化,我不知道如何检查操作系统.如果重要,我只关心32位.我在一些源代码中看到过类似的东西

#ifdef WIN32
Run Code Online (Sandbox Code Playgroud)

但我不知道这是如何工作的.

编辑:一些澄清.我在所有三个平台上都使用gcc.我不知道在每个平台中是否通过gcc定义了像WIN32这样的宏.如果是这样,这些常数似乎解决了我的问题.

linux windows macos porting

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

所有基本整数类型的重载是否足以捕获所有整数?

假设我对所有标准整数类型都有函数重载:

void foo( char );
void foo( signed char );
void foo( short );
void foo( int );
void foo( long );
void foo( long long );
// .... all unsigned variants as well
Run Code Online (Sandbox Code Playgroud)

是否有可能这些重载无法找到类似int8_t或类似的类型的适当重载?有可行的方法来处理这种过载吗?

参考怎么样?

澄清问题:它来自对这个问题的讨论为什么int8_t被读作一个字符?并声称可能存在编译器生成的整数类型,它们不是基本C++类型的别名.所以在这种情况下,所有基本情况的重载都可能不接受它.另一方面,我无法提供重载,int8_t因为在许多平台上它只是一个别名,并且会因重新定义现有的重载而出错.

c++ language-lawyer c++11

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

编译多平台时对未定义行为的困惑

我最近发现,在C++中使用两个下划线启动任何内容都是未定义的行为.

所以我一直在修理所有包括警卫.

但我遇到过类似的代码

#ifdef __WINDOWS___
#endif
#ifdef __GNUC__
#endif
Run Code Online (Sandbox Code Playgroud)

但是不是__GNUC__在Windows编译器UB上使用,反之亦然?我该怎么办?

c++ c-preprocessor

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

在C中检测终端应用中的用户OS

如何在C中确定终端应用程序中的用户操作系统?例如,在下面的代码中,我应该替换windowslinux使用什么?

/* pseudo code */
if(windows)
{system(cls)}
else if(linux)
{system(clear)}
else{...}
Run Code Online (Sandbox Code Playgroud)

我应该提一下,我是C的初学者,需要这样的东西,所以我的代码可以在windows和/或linux上运行,而不需要为每个代码创建单独的源代码.

c unix linux windows macos

2
推荐指数
1
解决办法
236
查看次数

我可以禁用或忽略 Apple 对 C 标准头文件的添加吗?

我正在开发一个 C 应用程序,我希望它具有合理的可移植性。它可以在 Linux 上使用 gcc 和 clang 以及在 Windows 上使用 MSVC 构建。访问 Mac 后,我尝试使用命令行工具进行构建。

它无法编译,因为我的代码声明了一个函数,isnumber而 Apple 的ctype.h头文件也声明了一个 (non standard?) isnumber。我可以重命名我的函数,这样它就不会发生冲突,但是有没有办法通过禁用或忽略所有或特定的 Apple 添加到标准标头来避免这种情况?例如,是否有编译器选项或预处理器编译指示来忽略它们?

isnumber不知道检查字符类。下面是重现该问题的代码 - 它可以用 clang/Linux 和 MSVC/Windows 编译,但不能在 Mac 上编译( - 它不是实际代码)。

#include <ctype.h>
#include <stdio.h>

char *isnumber(void);

int main(void)
{
    char *opt = "A";

    if (isupper(*opt))
        printf("THE IS NUMBER IS: %s\n", isnumber());
    else
        printf("The IS number is: %s\n", isnumber());

    return 0;
}

char *isnumber(void)
{
    return "IS-123";
} …
Run Code Online (Sandbox Code Playgroud)

c clang c-standard-library xcode-command-line-tools

2
推荐指数
1
解决办法
118
查看次数