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


当珍惜每一片时光~