项目开发期间的内部构建配置 - 良好实践

时间:2018-06-06 12:24:05

标签: c++ visual-studio macros c++17

首先抱歉模糊的标题。如果有人想出一个更好的人,请随时改变它。

我正在Visual Studio中开发一个c ++库,在开发过程中我希望能够更改一些内部构建配置(以便于测试,跟踪等),即编译顺序而不是并行执行代码(更容易调试) )。

我现在正在这样做的方法是在一个单独的头文件中定义一些宏:

BuildConfig.hpp

#pragma once

#ifdef _DEBUG 
    #define MM_DEBUG true
#else
    #define MM_DEBUG false
#endif

// temporarily overrules _DEBUG
#define MM_DEBUG true

#define MM_PARALLEL true
#define MM_DEBUG_SEQUENTIAL (MM_DEBUG && !MM_PARALLEL)

#if MM_PARALLEL
    #define MM_EXEC_POLICY std::execution::par
#else
    #define MM_EXEC_POLICY std::execution::seq
#endif

我使用头文件的唯一问题是我必须在基本上每个源(或头文件)文件中包含它以使宏可用。但是当我忘记在某个地方包含那个头文件时,这些源文件没有正确构建(因为所有#if语句将评估为false,因为该文件中不存在该宏)。

有没有办法 BuildConfig.hpp 中的所有宏导出到命令行,以便宏可以在项目范围内使用(例如_DEBUG还是__cplusplus)?

这甚至是一个好习惯吗?是否有更好的方法(在良好实践方面)实现我想要的目标?

修改

我找到了一种方法,可以使用 FI 标志(强制包含)在每个文件中包含 BuildConfig.hpp 标头。它位于项目属性> C / C ++>高级>强制包含文件

1 个答案:

答案 0 :(得分:0)

_DEBUG宏在项目范围内可用,因为它是在Visual Studio的项目属性页面中定义的。我不确定是否有可能将* .hpp中的宏导出到cmd(据我所知,这是不可能的)。当您使用Visual Studio标记问题时,我认为这是您使用的唯一IDE,并且您不关心可移植性。

对于Visual Studio,有一些属性表,用于保存项目的整个配置。它们由构建类型分隔(例如debug,release,x64,x86)。我认为使用它们可能是个好主意。您可以在MSDN上详细了解相关信息。恕我直言,我认为这比在一些源文件中保存所有内容更好,但这只是我的观点。

我不确定这是否更好。在许多C ++库的情况下,通常会有很多宏以与编写的内容类似的方式使用,例如检查编译器版本,并在定义_DEBUG时切换一些内容。其他选择可能是使用CMake来保存构建配置,但这几乎与Visual Studio Property Page相同(但是对其他操作系统来说更容易移植)。

重要的是永远不要做这种黑客攻击,因为有一天你会忘记删除它,这会给别人带来麻烦

// temporarily overrules _DEBUG
   #define MM_DEBUG true