定义预处理器宏

时间:2012-09-08 14:08:47

标签: c++ macros c-preprocessor

我对C ++比较陌生,我正在上课。我们的班级被分配了一个实验室,我的老师说实验室的写作有点难以理解;但是,他没有对实验室的记录做任何改动。所以,我遇到了实验室的这一部分:

  

定义预处理器宏

     

长期约定大写宏名称,此宏名称必须为TRACE_FUNC。宏有一个参数,当您将宏应用于代码时,该符号将被函数名替换。宏的开头看起来像这样:

#define TRACE_FUNC( symbol )  replacement-text`
     

并且预处理器将替换源代码中存在TRACE_FUNC(sym)字符串的替换文本,并将该符号提供给该替换。

     

注意:#define语句必须全部在一条逻辑行上。为了保持长度可管理,您可以在行尾用反斜杠转义换行符;这将使预处理器保持满意,同时允许您跨越多行的定义。

     

对于本练习,替换文本必须是完整的声明,包括终止分号。

     

替换文本必须是输出语句,用于打印符号,后跟调用的text()。和标准输出的换行符。您可以复制和修改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如果是的话,我应该怎么做呢?

2 个答案:

答案 0 :(得分:6)

哇,什么彻底的垃圾!你应该正确学习C ++,而不是预处理器的复杂性。

这是你应该做的事情,虽然为什么有人猜测。

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n"

void foo()
{
  TRACE_FUNC(foo);
  ...
}

我假设来自warning.cpp的例子使用std::cout如果没有,那么你将不得不将上述内容改编为你在warning.cpp中找到的内容。

我们的想法是每个函数都以使用TRACE_FUNC宏开始,因此您可以跟踪代码的执行情况。为什么教授认为这对新手来说是一个好主意超出了我。即使这是一个好主意,你也应该为自己找出细节甚至是愚蠢的。

我可以改进上面的宏,但这可能会更加混乱,所以我不会。现在我只是按照教授的说法去做但忽略它。希望他能够获得值得学习的东西。

答案 1 :(得分:-1)

这里有一个例子:使用你的libray中的ouput print函数替换这里的标准函数printf

 #define TRACE_FUNC(sym) printf("%s() called", #sym);

将其用作

TRACE_FUNC(printf)

输出应为

printf() called

您的实际任务是以定义的格式打印出符号。所以你需要在#define中使用printf或类似功能。