为什么“#define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1”没有按预期工作?

why "#define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1" doesn't work as expected?

参考:

https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/overview/core/handler_tracking.html https://www.boost.org/doc/libs/1_78_0/doc/html/boost_asio/example/cpp11/handler_tracking/async_tcp_echo_server.cpp

根据文档,当通过定义 BOOST_ASIO_ENABLE_HANDLER_TRACKING 启用时,Boost.Asio 将调试输出写入标准错误流。

我对 async_tcp_echo_server.cpp.

的源代码做了如下改动
 17 #define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1
 18 using boost::asio::ip::tcp;

using boost::asio::ip::tcp; 上方,我添加了 #define BOOST_ASIO_ENABLE_HANDLER_TRACKING 1 并预计这会触发调试轨道。但是,它不起作用。

$ g++ -std=gnu++2a -Wall -g -ggdb -Werror -I /usr/include/boost -pthread async_tcp_echo_server.cpp -o async_tcp_echo_server
$ ./async_tcp_echo_server 3333
^C

相反,我从源代码中删除了添加的宏定义,并将 -DBOOST_ASIO_ENABLE_HANDLER_TRACKING 添加到编译器的命令行,现在它按预期工作了。

$ g++ -std=gnu++2a -Wall -g -ggdb -Werror -I /usr/include/boost -pthread async_tcp_echo_server.cpp -o async_tcp_echo_server -DBOOST_ASIO_ENABLE_HANDLER_TRACKING
$ ./async_tcp_echo_server 3333
@asio|1645642051.016866|0^1|in 'do_accept' (async_tcp_echo_server.cpp:95)
@asio|1645642051.016866|0*1|socket@0x7ffec2082aa8.async_accept
@asio|1645642051.017322|.1|non_blocking_accept,ec=system:11

来自 g++ 在线手册,

-D name Predefine name as a macro, with definition 1.

问题> 为什么源代码中的宏定义不起作用?

谢谢

正如评论者有益地指出的那样:您必须定义预处理器定义 before 首次包含任何 (!) Asio header.

但是,在您的构建脚本中指定它还有另一个原因 FAR 优越。

使用BOOST_ASIO_ENABLE_HANDLER_TRACKING 中断界面。它 必须 在参与 link 的每个翻译单元中定义,否则您将有未定义的行为(ODR 违规)。参见例如Valgrind errors from boost::asio