3.5 – 更多标识符增容控制技术
在上科白 ([[3-4-Basic-debugging-tactics|3.4 — 基本上标识符增容控制技术]]) 中,他们展现了怎样全自动增容标识符。在这科白中他们提供更多一类捷伊形式,它能防止增容句子增添的难题:
增容句子使标识符显得纷乱;
增容句子使流程的输入显得纷乱;
增容句子在采用完后要删掉,这使它不容宠信;
增容句子须要修正标识符来加进和删掉,这可能会导入捷伊严重错误。
在这科白中,他们将积极探索这种做的许多基本上基本功。
为增容标识符加进继续执行前提
考量上面流程:
#include <iostream>int getUserInput(){std::cerr << “getUserInput() called\n”; std::cout << “Enter a number: “; int x{}; std::cin >> x; return x;}int main(){std::cerr << “main() called\n”; int x{ getUserInput() }; std::cout << “You entered: “ << x; return 0;}当完成难题定位后, 上述流程中的增容句子都须要被删掉或者注释掉。万一将来你还须要在这里定位难题,那么还得把它加回来或者放开它的注释。
一类更容易在整个流程中禁用和启用增容的方法是采用预处理器指令使增容句子具有前提:
#include <iostream>#define ENABLE_DEBUG // comment out to disable debuggingint getUserInput(){#ifdef ENABLE_DEBUGstd::cerr << “getUserInput() called\n”;#endif std::cout << “Enter a number: “; int x{}; std::cin >> x; return x;}int main(){#ifdef ENABLE_DEBUGstd::cerr << “main() called\n”;#endif int x{ getUserInput() }; std::cout << “You entered: “<< x; return 0;}这种一来,他们只须要注释或者取消对 #define ENABLE_DEBUG 的注释,即可宠信之前全部的增容句子,而不须要依次对其进行加进和删掉。如果你的项目中包含多个文件,则能把 #define ENABLE_DEBUG 定义到头文件中,然后被其他文件包含,这种一来在一处对此宏定义进行注释就能将效果应用到全部标识符文件。
这解决了要删掉增容句子的难题及其潜在的风险,但代价是标识符会更加纷乱。另一个缺点是,如果你犯了一个拼写严重错误(例如拼错了“DEBUG ”)或忘记将头文件包含到一个标识符文件中,该文件的部分或全部增容可能无法启用。因此,尽管这比无前提的版本更好,但仍有改进的空间。
采用日志
除了通过预处理器进行前提化增容,他们还能将增容信息发送到日志文件。日志文件是记录软件中发生的事件的文件(通常存储在磁盘上)。将信息写入日志文件的过程称为日志记录。大多数应用流程和操作系统都会编写日志文件,用于帮助诊断发生的难题。
因为写入日志文件的信息与流程的输入是分开的,所以能防止混合正常输入和增容输入所造成的纷乱。日志文件也能很容易地发送给其他人进行诊断——因此,如果软件客户遇到难题,你能要求他们将日志文件发过来,这可能有助于为你提供更多难题的线索。
虽然你能自己编写标识符来创建日志文件并向它发送输入,但他们还是推荐采用现有的许多第三方日志工具,具体用哪一个取决于你自己。
他们会采用plog日志记录器输入到日志记录器的样子。plog是一个纯头文件实现的库,因此很容易在任何须要它的地方包含它,而且它是轻量级的,易于采用。
#include <iostream>#include <plog/Log.h> // Step 1: include the logger headers#include <plog/Initializers/RollingFileInitializer.h>int getUserInput(){ PLOGD << “getUserInput() called”; // PLOGD is defined by the plog library std::cout << “Enter a number: “; int x{}; std::cin >> x; return x;}int main(){ plog::init(plog::debug, “Logfile.txt”);// Step 2: initialize the logger PLOGD << “main() called”; // Step 3: Output to the log as if you were writing to the console int x{ getUserInput() }; std::cout << “You entered: “ << x; return 0;}标识符输入的日志如下所示(在 Logfile.txt 文件中):
2018-12-26 20:03:33.295 DEBUG [4752] [main@14] main() called2018-12-26 20:03:33.296 DEBUG [4752] [getUserInput@4] getUserInput() called怎样包含、初始化和采用记录器取决于你选择的日志工具。
注意,采用这种方法也不须要前提编译指令,因为大多数记录器都有一类方法来减少/消除对日志的写入输入。这使标识符更容易阅读,因为前提编译行增加了很多纷乱。采用plog,能通过更改init句子来临时禁用日志记录:
plog::init(plog::none , “Logfile.txt”); // plog::none eliminates writing of most messages, essentially turning logging off他们不会在以后的课程中使用plog,所以你不须要担心学习它。
题外话
如果你想自己编译上面的例子,或者在你自己的项目中采用plog,能按照这些说明来安装它:
仓库;- 点击右上角的绿色Code按钮,然后选择“Download zip”。
接下来,在电脑上解压压缩包(假设是somewhere)。
最后,对于每个须要采用它的项目,在IDE的include directory设置 somewhere\plog-master\include\。如果你采用 Visual Studio 能参考:A.2 – 在visual studio中采用库,如果是Code::Blocks则参考A.3 – 在Code Blocks中采用库。