相关疑难解决方法(0)

像C中的宏一样的功能

我试图理解像Macros这样的功能的想法,但有几点让我迷惑.例如,我们说:

#define Max(a,b)  ((a)>(b)) ? (a):(b))
Run Code Online (Sandbox Code Playgroud)

我称之为

int i = Max(4,5);
Run Code Online (Sandbox Code Playgroud)

这将评估一个等价的条件表达式a>b?如果是,则a,否则b.但我对Max函数如何知道如何处理参数感到困惑.与实际函数不同,实现不是在调用程序的代码中编写的.是定义语句右边的声明为我做这个吗?这对我来说只是一个新事物,我想确保我理解这里发生的事情.

功能的这个特殊部分就像宏一样迷惑我.我知道这些类型的宏对于降低开销成本很有用,因为它们排除了在堆栈上节省内存的JSR RTS处理器指令.

c macros c-preprocessor

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

GCC和预编译头

在阅读了这篇精彩的文章(预编译标题的关注和喂养)之后,我对这些文章在现实生活中如何实际起作用存在疑问.更具体地说,我怎么知道在以下场景中我需要触发预编译头的重建:

  • 我决定#define在我的一个.cpp文件中改变预处理器解释已经包含在我的预编译头中的一些头的方式
  • 我在我的一个.cpp文件中包含另一个标题,该标题#define是特定的预处理器指令,它改变了预处理器解释已经包含在预编译头中的标头的方式
  • 更糟糕的是,当某些标头#include其他标头时,前一个问题可以递归发生

是否应该使用预编译的头文件强制执行某种限制性编码样式,例如将.cpp文件中包含的头文件数限制为一个并且永远不会将#define内容限制在.cpp文件中?

虽然微软的编译器可能在预先编译的头文件中做了不错的工作(通过应用一些特定于MS的voodoo),因为据我所知,它提供了应该做所有管道的选项/Yc/Yu选项,对于GCC来说,似乎这个功能需要Makefile中的大量手动工作和创造力,我无法找到应该解决使用预编译头文件的所有陷阱的模板.

例如,如果我有一个构建多个库的项目,为了在每次更改后不重建所有库,我必须在Makefile中使用一些非常可爱的sed技巧来检测#include当前库中的一个头文件是否被修改(或者它#include是一个修改过的标题).我担心甚至会想到预先构建的头文件实际上意味着的复杂性,以便构建脚本在每次必要时重建它们.

c++ dependencies gcc precompiled-headers

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