首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

错误记录C++预处理器宏__LINE __,__ FUNCTION__

在C++中,预处理器宏可以在编译阶段提供有关源代码的信息。__LINE____FUNCTION__是两个常用的预处理器宏,分别表示源代码中的行号和函数名。

__LINE__宏表示当前源代码文件中的行号,它在编译时被替换为源代码文件中的实际行号。这个宏通常用于在错误记录中记录发生错误的行号,以便开发者可以快速定位错误。

例如:

代码语言:c++
复制
#include<iostream>

int main() {
    std::cout << "This is line " << __LINE__<< std::endl;
    std::cout << "This is line " << __LINE__<< std::endl;
    std::cout << "This is line " << __LINE__<< std::endl;
    return 0;
}

输出:

代码语言:txt
复制
This is line 5
This is line 6
This is line 7

__FUNCTION__宏表示当前函数的名称,它在编译时被替换为当前函数的实际名称。这个宏通常用于在错误记录中记录发生错误的函数名,以便开发者可以快速定位错误。

例如:

代码语言:c++
复制
#include<iostream>

void foo() {
    std::cout << "This function is " << __FUNCTION__<< std::endl;
}

void bar() {
    std::cout << "This function is " << __FUNCTION__<< std::endl;
}

int main() {
    foo();
    bar();
    return 0;
}

输出:

代码语言:txt
复制
This function is foo
This function is bar

在实际开发中,开发者可以通过将__LINE____FUNCTION__宏组合使用,生成更加详细的错误记录信息,以帮助开发者快速定位和解决问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • C++雾中风景番外篇4:GCC升级二三事

    (终于可以使用C++17了,想想后续的开发也是很美好啊~~)不过这个过程之中也遇到了一些稀奇古怪的问题,在这里做一个简单的记录,希望后续有同学遇到类似的问题能作为参考。...operator 'operator" 这个我感觉是历史的遗留问题了,从C++11开始就不支持字符串字面量后面直接连接变量名,GCC 4.8.2应该是没有支持该编译检查,所以后续升级8.2的时候报了类似的错误...__LINE__, ##__VA_ARGS__) 上面是一段C++常用的日志定义,在定义展开的时候,编译器会默认将[%s][%s][%d]:,fmt,"\n"字面量拼接在一起,然后和后面行号等定义作为参赛打印出来...__LINE__, ##__VA_ARGS__) 2. error: flexible array member not at end of struct 在C++之中,给定了一个结构定义和一个指向结构的指针...这个理论上是一个很低级的错误,但是笔者花了比较长的时间排查,因为出现的实在是有些诡异。

    78931

    一行代码就能写一个日志打印组件,你信吗?为你揭晓RTOS中日志打印组件的核心

    做实验引发的思考 在学习LiteOS日志打印组件使用的时候,我记录了一篇博客:atiny_log | LiteOS 物联网操作系统中的日志打印组件使用分享,关于实验的具体内容,请阅读这篇博客(点击阅读原文即可访问...C语言编译器中内置了一些定义,这些内置定义可以巧妙地帮我们输出非常有用的调试信息,在RTOS的日志打印组件中通常用到了这三个内置定义: __FILE__:在源文件中插入当前源文件名; __FUNCTION...__:在源文件中插入当前函数名; __LINE__:在源代码中插入当前源代码行号; 利用这三个定义,使用一行代码即可编写一个最简单的日志打印组件: #define DEBUG(format,...)...printf("[%s:%05d][%s]"format"\r\n", __FILE__, __LINE__, __FUNCTION__) 编写一个小程序测试这个仅有一行代码的日志打印组件: #include... #define DEBUG(format,...) printf("[%s:%05d][%s]"format"\r\n", __FILE__, __LINE__, __FUNCTION

    88540

    c++c 获取cpp文件行号跟文件名

    编译器内置: 先介绍几个编译器内置的定义,这些定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。...ANSI C标准中有几个标准预定义(也是常用的): __LINE__:在源代码中插入当前源代码行号; __FILE__:在源文件中插入当前源文件名; __DATE__:在源文件中插入当前的编译日期 _..._TIME__:在源文件中插入当前编译时间; __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1; __cplusplus:当编写C++程序时该标识符被定义。...(file,__FILE__); //文件名     sprintf(func,__FUNCTION__);//函数名     printf("file=%s\n",file);     printf(..."func=%s\n",func);     printf("%05d\n",__LINE__);//行号    return 0;   }

    1.8K70

    C++代码调试方式建议

    程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免。所有程序可能出现的错误可分为两类:语法错误和逻辑错误。调试通常是指在消除了语法错误之后,发现程序中的逻辑错误的过程。...对C/C++程序进行调试,有这样集中常用的手段。它们既可以单独使用,也可以配合使用。 2. 代码调试方式的几点建议 2.1使用打印语句 这是最朴素,也是最直接的方法。...因此,C++提供了几个,他们分别是__FILE__、__FUNCTION__和__LINE__,可以利用它们“自动“获取有关模块、函数和行的信息。考察如下程序。...assert是一个只在调试版本下起作用的。另外,用户也可以定义自己的辅助来完成调试任务。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P379-P382]

    1.5K30

    C++实现简易log日志系统

    1.log日志的作用 在软件开发周期中,不管是前台还是后台,系统一般会采用一个持久化的日志系统来记录运行情况。 在代码中嵌入log代码信息,主要记录下列信息: (1)记录系统运行异常信息。...2.log日志的类型与级别 2.1日志的类型 主要分三大类: 安全类信息:记录系统边界交互行为和信息; 业务类信息:记录系统内部业务处理行为和信息; 性能类信息:记录系统硬件对业务处理的支撑能力。...2.3常见的开源log工具 C/C++实现的开源log常见有:C++版的log4j 的log4cplus、快速的 C++ 日志库——spdlog、纯C日志函数库 ——zlog、C++日志框架——GoogleGlog...3.自实现log工具          主要针对ERROR(错误)、WARN(警告)和INFO(通知)这三种日志类型实现了如下的C++简易log工具。...__,__FUNCTION__) /// /// \brief 利用日记进行检查的各种 /// #define CHECK(a)

    8.5K21

    CC++代码调试的几点建议

    程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免。所有程序可能出现的错误可分为两类:语法错误和逻辑错误。调试通常是指在消除了语法错误之后,发现程序中的逻辑错误的过程。...因此,C++提供了几个,他们分别是__FILE__、__FUNCTION__和__FILE__,可以利用它们“自动“获取有关模块、函数和行的信息。考察如下程序。...__<<endl; } void func3(){ cout<<__LINE__<<endl; } int main(int argc,char* argv[]){ func1();...assert是一个只在调试版本下起作用的。另外,用户也可以定义自己的辅助来完成调试任务。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[P379-P382]

    64310

    提高代码逼格的利器:定义-从入门到放弃

    的本质就是代码生成器,在预处理器的支持下实现代码的动态生成,具体的操作通过条件编译和扩展来实现。我们先在心中建立这么一个基本的概念,然后通过实际的描述和代码来深入的体会:如何驾驭定义。...#endif); 扩展(macro expansions); 行控制(line control)。 2....编译时间; 例如: printf("file name: %s, function name = %s, current line:%d \n", __FILE__, __FUNCTION__, __LINE...所以,从代码的动态生成角度看,定义和 C++ 中的模板参数有点神似,只不过定义仅仅是代码扩展而已。...动态创建错误编码与对应的错误字符串 这也是一个非常巧妙的例子,利用了 #(字符串化) 和 ##(拼接) 这 2 个功能来动态生成错误编码码和相应的错误字符串: #define MY_ERRORS

    1.2K40
    领券