我对 C++ 比较陌生,我正在学习它。我们班被分配了一个实验室,我的老师说实验室的文章有点难以理解;然而,他并没有对实验室的文章做任何修改。所以,我遇到了实验室的这一部分:
定义预处理器宏
长期以来的约定是宏名大写,这个宏名必须是TRACE_FUNC。宏有一个参数,当您将宏应用于代码时,该参数将被函数名替换。宏的开头如下所示:
#define TRACE_FUNC( symbol ) replacement-text`
并且预处理器将在源代码中存在 TRACE_FUNC(sym) 字符串的任何地方替换替换文本,并将符号输入到该替换中。
注意:#define 语句必须全部位于单个逻辑行上。为了保持长度可控,您可以在行尾使用反斜杠转义换行符;这将使预处理器保持满意,同时允许您跨越多行定义。
对于本练习,替换文本必须是完整的语句,包括终止分号。
替换文本必须是输出语句,该语句打印符号后跟调用的文本 ()。和标准输出的换行符。您可以从 warning.cpp 源文件复制和修改其中一个输出语句。
warning.cpp
只是我们正在使用的一个文件,TRACE_FUNC
它被放置在一个头文件中。
所以,我读了几次,我不是 100% 确定它在问什么。从某种角度来看,它似乎要求我创建一个名为 TRACE_FUNC 的宏。如果换个角度看,它要求我使用宏 TRACE_FUNC。所有这些都很好,但我根本不知道如何使用 TRACE_FUNC,我在任何地方都找不到任何文档,也不知道如何创建宏。当我寻求帮助时,我的老师只是说。单词而不是那些非常有用的单词,因为它是一个非常曲折、令人困惑的答案,没有解释 TRACE_FUNC 实际上是什么。
基本上,我的老师所说的只是其中的符号TRACE_FUNC
需要是源代码中的一个函数的名称。例如,假设我们foo()
在警告中有一个函数,那么根据他的解释,该符号应该是foo()
(或 foo,我也不确定)。此外,在替换文本中,如果我将名称放在#
符号前面,显然名称本身将被替换。我认为这应该表示预处理器指令。为什么我应该在这里使用它?
无论如何,照我老师说的做几乎没有任何用处。这条线也没有
#define TRACE_FUNC( foo() ) #foo() called. ;
也不是这条线
#define TRACE_FUNC( foo ) #foo () called. ;
替换任何文本,我很确定这是#define 指令的操作。所以我一定是以错误的方式应用我的老师所说的,但我真的不知道为什么它是错误的或如何解决它。
所以,我的问题。实际上是TRACE_FUNC
一个宏,如果是,是否有任何我可以阅读的文档?或者我应该创造TRACE_FUNC
,如果是这样,我应该怎么做?