C ++ Linux代码打破了Windows构建,因为缺少标头意味着函数未定义

问题描述 投票:0回答:2

我正在使用Windows上的Visual Studio在C ++中开发一个软件。从一开始,我想让它在Windows和Linux上运行。显然,我不会在Windows机器上编译Linux二进制文件,但我仍然想使用Visual Studio编写代码。

当涉及到标题时,我根据预处理器定义选择要使用的文件。

一个非常简单的例子:

#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”中是否合理,以便只在正确的操作系统上启用代码?

c++ c linux windows cross-platform
2个回答
0
投票

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


5
投票

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

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

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

如果您要为特定于Windows和特定于Linux的代码创建单独的源文件,那么重点是您在构建时仅使用适当的一个用于当前平台。

另一种方法是将两个实现都放在同一个源文件中,使用条件编译来选择要使用的部分。这也是非常传统的,特别是在变化的部分小于整个功能的情况下。

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

如果要创建单独的,特定于平台的源文件,然后使用条件编译将它们全部包含在每个构建中,那将会很奇怪。它可以工作,但它不属于我个人对“合理”的定义。

© www.soinside.com 2019 - 2024. All rights reserved.