C++ 从函数返回的位置获取行号

C++ 从函数返回的位置获取行号,c++,debugging,raii,C++,Debugging,Raii,我有一个cpp函数,它有基于不同标志集和不同控制流的多个返回点。有没有一种方法可以在不为每个返回语句添加调试行的情况下确定使用了哪个返回语句?(仅从返回值很难计算返回点) 我已经使用RAII来记录函数的进入和退出。我需要能够记录它返回的行号 我尝试四处搜索,但没有找到任何与我想要的内容相近的内容您可以在日志语句中使用标准的\uuuuuu行预定义宏: 从: 此宏将扩展为当前输入行号,格式为 十进制整数常量。虽然我们称之为预定义宏,但它是一个 非常奇怪的宏,因为它的“定义”随着每个新的 一行源代码

我有一个cpp函数,它有基于不同标志集和不同控制流的多个返回点。有没有一种方法可以在不为每个返回语句添加调试行的情况下确定使用了哪个返回语句?(仅从返回值很难计算返回点)

我已经使用RAII来记录函数的进入和退出。我需要能够记录它返回的行号


我尝试四处搜索,但没有找到任何与我想要的内容相近的内容

您可以在日志语句中使用标准的
\uuuuuu行
预定义宏:

从:

此宏将扩展为当前输入行号,格式为 十进制整数常量。虽然我们称之为预定义宏,但它是一个 非常奇怪的宏,因为它的“定义”随着每个新的 一行源代码


理想情况下,使代码更简单,减少返回点的数量,或在返回值本身中包含有关返回点的信息。

您可以在日志语句中使用标准的
\uuuuline\uuu
预定义宏:

从:

此宏将扩展为当前输入行号,格式为 十进制整数常量。虽然我们称之为预定义宏,但它是一个 非常奇怪的宏,因为它的“定义”随着每个新的 一行源代码


理想情况下,使您的代码更简单,减少返回点的数量,或者在返回值本身中包含有关返回点的信息。

返回类型乐趣(args)
更改为
配对乐趣(args)
返回val
使用
返回组合乐趣(val,LINE)
更改
返回类型乐趣(args)
pair fun(args)
return val
return make_pair(val,uuu LINE_u)
可以做的一件事是将方法的返回类型更改为
元组

元组中的一个元素是原始返回值


第二个元素可以使用
\uuuuu行
宏。您可以只返回行号,也可以返回一个
字符串,其中包括行号和关于返回点的其他可能的信息性日志信息。

您可以做的一件事是将方法的返回类型更改为
元组

元组中的一个元素是原始返回值


第二个元素可以使用
\uuuuu行
宏。您可以只返回行号,也可以返回一个
字符串,其中包括行号和有关返回点的其他可能的信息性日志信息。

您可以使用预处理器宏:

#define return std::cerr << __FILE__ << ":" << __LINE__ << " return " << std::endl; return 
因此,您不会收到很多您不关心的带有
return
s的日志消息

编辑: 顺便说一下,如果您有一个RAII对象,用于将其记录到函数条目中,您可以执行以下操作:

#define return entry_raii_object.exited_at(__LINE__); return

以后别忘了取消定义。我个人更喜欢使用不同的关键字来记录返回,比如
#define logged_return。。。;返回

您可以使用预处理器宏:

#define return std::cerr << __FILE__ << ":" << __LINE__ << " return " << std::endl; return 
因此,您不会收到很多您不关心的带有
return
s的日志消息

编辑: 顺便说一下,如果您有一个RAII对象,用于将其记录到函数条目中,您可以执行以下操作:

#define return entry_raii_object.exited_at(__LINE__); return


以后别忘了取消定义。我个人更喜欢使用不同的关键字来记录返回,比如
#define logged_return。。。;return

你可以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>宏,但这确实会产生非常脆弱的代码--你能再解释一下你的代码吗?我想调试代码,在函数启动的地方设置断点,单步执行函数不是一个选项吗,但是这确实会产生非常脆弱的代码--你能再解释一下你的代码吗?我想调试代码,在函数开始的地方设置断点,单步执行函数不是一个选项?我同意,您要寻找的特定类型的元组是Mohit Jain答案中描述的“对”。我同意,您要寻找的特定类型的元组是Mohit Jain答案中描述的“对”。这是最好的非调试模式选项。这意味着改变它的方式到处打电话。这只是为了调试目的,而不是一般的用例。调试信息应该记录在上下文中,因为调用函数行号不太可能与调用函数相关。(在我看来,传递默认引用参数是更好的选择,因此您不必更改现有调用,例如,
int func(int&lineno=LINE\u ZERO
)在这种情况下,我希望在返回之前使用print语句。
print\u LINE();return val;
PRINT_LINE只能在调试模式下定义。这是最好的非调试模式选项。这意味着更改在任何地方调用它的方式。这只是为了调试目的,而不是一般用例。调试信息应该记录在上下文中,因为调用函数行号在调用中不太可能相关er函数。(在我看来,传递默认引用参数是更好的选择,因此您不必更改现有调用,例如,
int func(int&lineno=LINE_ZERO
)在这种情况下,我希望在返回之前使用print语句。
print_LINE();return val;
PRINT_LINE只能在调试模式下定义。请注意,如果(false),它将不适用于
ifreturn;/*宏未到达的其他代码*/
作为
return
将不再位于if块中。定义关键字是非法的,如果宏类似于“return”或“return”,则该方法可以,但
return
只是不能将其剪切。@Jarod42:实现上的观点很好,但方法仍然是合理的。宏可以是r