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