【问题标题】:Common Code Behaviour常见代码行为
【发布时间】:2015-01-15 08:04:43
【问题描述】:

我正在开发一个客户端-服务器应用程序,其中包含一些用于调试的通用文件。 我的查询是在运行时将这个公共代码(调试文件)的单独副本分配给两个模块,或者它们共享相同的代码空间。例如:

我想为客户端和服务器定义不同的日志标签。为此,我在客户端和服务器的 make 文件中定义了两个标志 CLI_LOG_TAG_ENABLE 和 SERVER_LOG_TAG_ENABLE。现在在 debug.h

//debug.h


#ifdef CLI_LOG_TAG_ENABLE 
#define LOG_TAG "CLIENT"
#elif SERVER_LOG_TAG_ENABLE
#define LOG_TAG "SERVER"
#endif

因此,在朗姆酒时间,由于进行文件更改,两个标志都将被启用。 你能告诉我会是什么行为以及为什么吗?

【问题讨论】:

  • #elif#ifdef 不匹配。你需要#elif defined

标签: c++ c logging c-preprocessor


【解决方案1】:

在您的代码中,

#ifdef CLI_LOG_TAG_ENABLE 
#define LOG_TAG "CLIENT"
#if SERVER_LOG_TAG_ENABLE   //did you mean ifdef ?
#define LOG_TAG "SERVER"
#endif

为了安全起见,您可以使用

#ifdef CLI_LOG_TAG_ENABLE 
#define LOG_TAG "CLIENT"
#else
#define LOG_TAG "SERVER"
#endif

只需在客户端模块中定义CLI_LOG_TAG_ENABLE,不理会服务器模块。希望这会有所帮助!

【讨论】:

  • 感谢 sourav 非常简短的回复。所以会有单独的副本分配给两个模块,对吗?否则它总是会发现 CLI_LOG_TAG_ENABLE 已启用并且总是会 pring CLIENT?
  • 在 SERVER 模块 makefile 中,不要定义 CLI_LOG_TAG_ENABLE。在客户端模块 makefile 中,定义 CLI_LOG_TAG_ENABLE。编译两个单独的实例。对吗?
  • 是的,这就是我正在做的事情!
【解决方案2】:

因此,如果您有一个使用LOG_TAG 编译的公用文件,或者设置为"CLIENT""SERVER",则该字符串将包含在使用LOG_TAG 的源代码中,就好像您的源代码包含"CLIENT""SERVER" 取决于在编译时设置的 LOG_TAG

假设文件 debug.h 包含在 myfile.c 中,如下所示:

cout << LOG_TAG << " Some debug message" << endl;

然后,当 myfile.c 编译时将 LOG_TAG 设置为 "SERVER",它将使用与您编写的代码相同的代码:

cout << "SERVER" << "Some debug message" << endl;

如果设置为"CLIENT",代码如下:

cout << "CLIENT" << "Some debug message" << endl;

值得注意的是,这发生在正确的编译器看到代码之前——预处理器是一个单独的步骤(它不知道你是在编译 C、处理汇编文件还是使用它来生成与#define NAME "Mr Mats Petersson"Dear NAME, my name is John Smith, and I'm writing to inform you that my client, a prince in my country, would like to borrow your bank account to transfer $12188138 out of the country 之类的邮件合并。)

在使用这种技巧时,将源代码编译到单独的目录也很重要,否则您的构建系统可能没有意识到文件 myfile.c 需要使用新设置重新编译,然后您的日志记录将非常混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2010-10-19
    相关资源
    最近更新 更多