Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;Linux代码破坏了Windows构建,因为缺少标题意味着函数未定义 我在Windows上使用VisualStudio开发了一个C++软件。从一开始,我想让它同时在Windows和Linux上运行。显然,我不会在Windows机器上编译Linux二进制文件,但我仍然希望使用Visual Studio编写代码_C++_C_Linux_Windows_Cross Platform - Fatal编程技术网

C++;Linux代码破坏了Windows构建,因为缺少标题意味着函数未定义 我在Windows上使用VisualStudio开发了一个C++软件。从一开始,我想让它同时在Windows和Linux上运行。显然,我不会在Windows机器上编译Linux二进制文件,但我仍然希望使用Visual Studio编写代码

C++;Linux代码破坏了Windows构建,因为缺少标题意味着函数未定义 我在Windows上使用VisualStudio开发了一个C++软件。从一开始,我想让它同时在Windows和Linux上运行。显然,我不会在Windows机器上编译Linux二进制文件,但我仍然希望使用Visual Studio编写代码,c++,c,linux,windows,cross-platform,C++,C,Linux,Windows,Cross Platform,说到头文件,我会根据预处理器定义选择要使用的while文件 一个非常基本和简单的例子: #pragma once #ifndef PLATFORM_TIMER_H #define PLATFORM_TIMER_H #ifdef _WIN32 #include "win32\win32_timer.h" #elif __linux__ #include "linux\linux_timer.h" #endif #endif // PLATFORM_TIMER_H 对于标题来说,它工

说到头文件,我会根据预处理器定义选择要使用的while文件

一个非常基本和简单的例子:

#pragma once
#ifndef PLATFORM_TIMER_H
#define PLATFORM_TIMER_H

#ifdef _WIN32

#include "win32\win32_timer.h"

#elif __linux__

#include "linux\linux_timer.h"

#endif 

#endif // PLATFORM_TIMER_H
对于标题来说,它工作得很好。但是Linux实现的.cpp文件破坏了Windows上的构建。这是因为Linux.cpp文件无论在什么情况下都会被编译,即使在Windows上也是如此。而且,由于Windows计算机缺少Linux标头,因此它使用的函数将是未定义的

问题1:处理这一问题的“行业标准”是什么


问题2:将.h和.cpp文件包装在“#ifdef PLATFORM”中是否合理,以便代码只能在正确的操作系统上启用?

特定于一个操作系统的任何代码都需要设置正确的
#ifdef
,无论是在头文件还是源文件中。

特定于一个操作系统的任何代码都需要设置正确的
#ifdef
,无论是在头文件还是源文件中

但是Linux实现的.cpp文件破坏了Windows上的构建。这是因为Linux.cpp文件无论在什么情况下都会被编译,即使在Windows上也是如此

为什么要为Windows版本编译Linux特定文件

问题1:处理这一问题的“行业标准”是什么

如果要为特定于Windows和特定于Linux的代码创建单独的源文件,那么关键是在构建时只使用适合当前平台的源文件

另一种方法是将两个实现放在同一个源文件中,使用条件编译来选择要使用的部分。这也是非常传统的,尤其是在变化的部分比整体函数小的情况下

问题2:将.h和.cpp文件包装在“#ifdef PLATFORM”中是否合理,以便代码只能在正确的操作系统上启用

创建独立的、特定于平台的源文件,然后使用条件编译将它们全部包含在每个构建中,这将是一件奇怪的事情。这是可行的,但不属于我个人对“合理”的定义

但是Linux实现的.cpp文件破坏了Windows上的构建。这是因为Linux.cpp文件无论在什么情况下都会被编译,即使在Windows上也是如此

为什么要为Windows版本编译Linux特定文件

问题1:处理这一问题的“行业标准”是什么

如果要为特定于Windows和特定于Linux的代码创建单独的源文件,那么关键是在构建时只使用适合当前平台的源文件

另一种方法是将两个实现放在同一个源文件中,使用条件编译来选择要使用的部分。这也是非常传统的,尤其是在变化的部分比整体函数小的情况下

问题2:将.h和.cpp文件包装在“#ifdef PLATFORM”中是否合理,以便代码只能在正确的操作系统上启用


创建独立的、特定于平台的源文件,然后使用条件编译将它们全部包含在每个构建中,这将是一件奇怪的事情。它可以工作,但不属于我个人对“合理”的定义范围。

所以在#ifdefs中围绕源文件并不奇怪?谢谢你的快速回答!将接受ASAP@Markall一点也不。要么这样,要么不要在Windows上编译Linux特定的文件。
#ifdef
s在代码中是脏的,应该避免,除了一些小的调整。应该将实现拆分为单独的文件,大多数情况下,两个文件就足够了:一个用于windows,另一个用于类unix系统。因此,在#ifdefs中围绕源文件并不奇怪?谢谢你的快速回答!将接受ASAP@Markall一点也不。要么这样,要么不要在Windows上编译Linux特定的文件。
#ifdef
s在代码中是脏的,应该避免,除了一些小的调整。应该将实现拆分为单独的文件,大多数情况下2个文件就足够了:一个用于windows,另一个用于类似unix的系统。此处的#pragma once不有用。您已经确保使用PLATFORM#TIMER#H宏只编译一次。另外,#pragma once并不是通用的,特别是当您进行跨平台的.Unrelated时,但是为什么要同时使用
#pragma once
和旧式的包含保护?编辑:只需阅读前面的评论。此外,我还没有遇到一个现代编译器,它不知道如何处理
#pragma once
。你的反斜杠是错误的。把它们变成斜杠。@jbeck:两者都用不是不合理的。“旧式”包含保护将覆盖所有
#pragma once
可能失败的情况(例如,使用网络共享时不同路径上的相同文件),而
#pragma once
可能会让您在正常情况下加快速度。就我个人而言,我通常一次也不去想
#pragma
。但是,我确实在include-guard名称中添加了生成的随机散列。如果您已经确保使用PLATFORM\u TIMER\H宏只编译一次,#pragma once在这里没有用处。另外,#pragma once并不是通用的,特别是当您进行跨平台的.Unrelated时,但是为什么要同时使用
#pragma once
和旧式的包含保护?编辑:只需阅读前面的评论。此外,我还没有遇到一个现代编译器,它不知道如何处理
#pragma once