C++编程冷知识
如何输出程序的源代码?
C++中可以使用专用的宏定义实现输出程序的源代码。C++中定义了一些专用的宏可以方便的帮助调试和输出日志,其中包括:
名称 | 含义 |
---|---|
__FILE__ | 源文件的名称,字符串常量类型 |
__LINE__ | 行号,十进制常量类型 |
__func__或__FUNCTION__ | 当前函数名,字符串常量类型 |
__DATE__ | 日期,形式为Mm dd yyyy格式的字符串常量 |
__TIME__ | 时间,hh:mm:ss格式的字符串常量 |
因此,可以使用FILE来输出源文件自身,如下所示:
#include<bits/stdc++.h> using namespace std; //程序输出源文件自身 int main(){ ifstream ifs(__FILE__); cout<<ifs.rdbuf(); ifs.close(); return 0; }
输出结果:
#include<bits/stdc++.h> using namespace std; //程序输出源文件自身 int main(){ ifstream ifs(__FILE__); cout<<ifs.rdbuf(); ifs.close(); return 0; }
如何在main之前执行某些操作?
有三种方法可以在main之前执行一些操作:gcc扩展标记、使用函数初始化静态变量、使用lambda表达式为一个数字赋值。三种方法的示例如下所示:
#include<bits/stdc++.h> using namespace std; //方法一,使用gcc扩展,将函数标记为在main之前进行执行 //__attribute__((constructor)) //与之对应的是 //__attribute((destructor))标记函数在main之后执行 __attribute__((constructor))void before(){ cout<<"beforemain"<<endl; } __attribute__((destructor))void after(){ cout<<"aftermain"<<endl; } //方法二,使用静态变量,在main之前赋值 int useStatic(){ cout<<"useStatic"<<endl; return 0; } static int static_num = useStatic(); //方法三,使用lambda表达式为一个数字赋值 int lambda_num = [](){ cout<<"useLambda"<<endl; return 0; }(); int main(){ cout<<"main"<<endl; return 0; }
输出结果如下所示:
useStatic useLambda beforemain main aftermain
如何在main之后执行某些操作?
在main函数执行结束之后可以使用以下三种方法执行某些操作:gcc扩展标记、静态变量析构函数、atexit注册一个函数在main之后执行。三种方法的示例如下所示:
#include<bits/stdc++.h> using namespace std; //方法一,使用gcc扩展,将函数标记为在main之后进行执行 //__attribute((destructor))标记函数在main之后执行 __attribute__((destructor))void after(){ cout<<"aftermain"<<endl; } //方法二,静态变量的析构 class UseStatic{ public: UseStatic(){} ~UseStatic(){ cout<<"~UseStatic"<<endl; } }; static UseStatic static_class; int main(){ //方法三,使用atexit注册一个函数,在main之后执行,执行顺序与注册顺序反 atexit([](){cout<<"atexit first"<<endl;}); atexit([](){cout<<"atexit second"<<endl;}); cout<<"main"<<endl; return 0; }
输出结果如下所示:
main atexit second atexit first ~UseStatic aftermain
如何读取一个文件的字节数?
C++中可以使用以下两种方法获取一个文件的字节数:stat函数读取文件信息、打开文件读取文件末尾的位置。两种方式的示例如下所示:
#include <bits/stdc++.h> #include <sys/stat.h> using namespace std; int getFileSize(string filename) { struct stat stat_buf; // stat函数读取第一个参数的文件信息,存储在第二个参数中 stat(filename.c_str(), &stat_buf); return stat_buf.st_size; } int getFileSizetwo(string filename) { //以二进制方式打开文件并将文件指针移动至尾部 ifstream in(filename, ios::binary | ios::ate); //返回当前指针的文件位置,也就是字节数 return in.tellg(); } int main() { //使用两种方式输出本文件的字节数 cout << getFileSize(__FILE__) << endl; cout << getFileSizetwo(__FILE__) << endl; return 0; }
输出结果如下所示:
698 698
Comments | 2 条评论
使用MFC写了文件字节数GUI APP,静态链接,后台占用9M
https://imgloc.com/i/Iz0So