为什么“#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
参考:
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