#define值在单独的文件中,它将如何影响编译?

时间:2016-10-09 23:31:32

标签: c++ c-preprocessor


我试图做那样的事情(在多个文件中):

common_header.h:

value = os.environ.get(variable)
...
elif isinstance(value, ConfigList) or isinstance(value, ConfigTree):

common_header.cpp:

value

file_1.cpp:

#define NX           256        //! grid size: x axis
#define NY           256        //! grid size: y axis
#define NZ           256        //! grid size: z axis
#define DX           0.5f       //! grid step: x axis
#define DY           0.5f       //! grid step: y axis
#define DZ           0.5f       //! grid step: z axis
#define DT           0.1f       //! grid step: time

extern std::ostream stream_out

file_2.cpp:

std::ostream stream_out("data_out.txt", ios_base::out);

file_3.cpp:

//functions are using #defined values
(...)

我的问题是:

  • 当我使用一组定义的值编译程序,然后更改它们,然后再次编译程序时会发生什么?
  • 编译器会重新构建整个程序吗?或者它只是重新构建一个文件:“common_header.o”和程序的其余部分将保持不变?

我在问c ++,
我感兴趣的编译器:

  • visual studio compiler
  • gcc编译器
  • nvcc编译器

非常感谢!

编辑:

sory我误导你..我在common_header.h中声明了很少的全局外部值(例如数据流),并且在common_header.cpp文件中定义它们会改变什么吗?我在每种情况下都得到* .o文件

2 个答案:

答案 0 :(得分:0)

  

当我使用一组定义的值编译程序,然后更改它们,然后再次编译程序时会发生什么?

程序将使用新定义重新编译,而不是旧定义。

  

我在common_header.h中声明了很少的全局外部值(例如数据流),并且在common_header.cpp文件中定义它们会改变什么吗?编译器会重新构建整个程序吗?或者它只是重新构建一个文件:common_header.o并且程序的其余部分将保持不变?

构建系统将至少重建所有依赖于标头的文件。较旧的系统要求您指定依赖项;更现代的将自动检测依赖。

这不是特定于编译器的。一些构建系统将比其他构建系统更有效地执行此操作 - 例如,通过跳过重新编译cpp文件及其所有依赖项不变。但是,您应该依赖的效果是将重建标头的所有依赖项。

答案 1 :(得分:0)

Visual Studio IDE非常智能,可以在头文件更改时重新编译使用头文件的源文件。

您表示您正在使用GCC和NVCC make。是否重新编译源文件取决于您的 Makefile - 它与编译器或make无关。