通用代码行为

时间:2014-11-18 07:51:28

标签: c++ c logging c-preprocessor

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

我想为客户端和服务器定义不同的日志标记。为此,在客户端和服务器的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

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

2 个答案:

答案 0 :(得分:2)

在您的代码中,

#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,保持服务器模块不变。希望这会有所帮助!!

答案 1 :(得分:1)

因此,如果您使用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,然后你的日志记录将会非常混乱。