C中的一些不怎么常见的用法explict与va_list

最近由于工作原因在跟一个很老的几乎全有C和一部分C++98完成的一个项目,也让我发现了很多之前使用的时候并没有注意到的一些有意思的用法。

explict

explict关键字是用来防止由构造函数定义的隐式转换。平时自己写一些小项目不太用c,因此也不太碰到隐式转换的。隐式转换指的是当传入参数与构造函数需要的参数相同时,会自动生成一个临时的实例。但是假设我们需要的实例的属性并不止这一个参数,就会引起错误。因此在强类型判定条件下建议附带这个关键字。

va_list

可能是之前python写多了,在这个老代码中居然发现了c的可变参数的定义!非常的神奇。下面以一个支持%s和%d的printf的实现来表述一下这个是怎么用的。

#include <stdarg.h>
#include <iostream>
using namespace std;

void myPrint(const char *format, ...) {
    va_list argptr;
    va_start(argptr, format);

    char c;
    while (c = *(format++)) {
        if (c == '%') {
            c = *(format++);
            if (c == 's') {
                char *name = va_arg(argptr, char*);
                cout << name;
            }
            if (c == 'd') {
                int name = va_arg(argptr, int);
                cout << name;
            }
        }
        else {
            cout << c;
        }
    }
    cout << endl;
    va_end(argptr);
}

int main() {
    myPrint("12312sdfsd%s,%d", "fuck", 2);
    return 0;
}

代码比较简单,就不解释了。主要看一下中间是如何解析不定参数的。