我正在开发一个客户端 - 服务器应用程序,其中包含一些用于调试的常用文件。 我的查询是在运行时将这个公共代码(调试文件)的单独副本分配给两个模块或它们共享相同的代码空间。例如:
我想为客户端和服务器定义不同的日志标记。为此,在客户端和服务器的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文件更改,两个标志都将被启用。 你能否告诉我这将是什么行为?为什么?
答案 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,然后你的日志记录将会非常混乱。