首页 文章

定义预处理器宏

提问于
浏览
5

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

定义预处理器宏长期约定将宏名称大写,此宏名称必须为TRACE_FUNC . 宏有一个参数,当您将宏应用于代码时,该符号将被函数名替换 . 宏的开头如下所示:#define TRACE_FUNC(symbol)replacement-text`
并且预处理器将替换源代码中存在TRACE_FUNC(sym)字符串的替换文本,并将符号提供给该替换 . 注意:#define语句必须全部在一条逻辑行上 . 为了保持长度可管理,您可以在行尾用反斜杠转义换行符;这将使预处理器保持满意,同时允许您跨越多行的定义 . 对于本练习,替换文本必须是完整的语句,包括终止分号 . 替换文本必须是输出语句,用于打印符号,后跟调用的text() . 和标准输出的换行符 . 您可以复制和修改warning.cpp源文件中的一个输出语句 .

warning.cpp 只是我们正在使用的文件, TRACE_FUNC 被放置在头文件中 .

所以,我读了几遍,我不是百分之百确定它在问什么 . 从某种角度来看,似乎要求我创建一个名为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指令的操作 . 所以我必须以错误的方式应用我的老师所说的,但我不知道为什么这是错的或如何解决它 .

So, my question. Is TRACE_FUNC actually a macro and if so, is there any documentation on it that I can read? Or am I supposed to be creating TRACE_FUNC and if so, how exactly am I supposed to do that?

2 回答

  • -1

    哇,什么彻底的垃圾!你应该正确地学习C,而不是预处理器的错综复杂 .

    这是你应该做的,虽然为什么有人猜 .

    #define TRACE_FUNC(sym) std::cout << #sym << "() called\n"
    
    void foo()
    {
      TRACE_FUNC(foo);
      ...
    }
    

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

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

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

  • 6

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

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

    用它作为

    TRACE_FUNC(printf)
    

    输出应该是

    printf() called
    

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

相关问题