C_可变参数详解

这个视频是我自己录的,讲了C语言的可变参数是怎么实现的。
讲解视频地址

代码

// C++ author 清晨与猫鱼
#include 
#include 

using namespace std;

#define VA_START(args, type) ( args = (char*)&type + sizeof (type) )       // 可变参数包的起始地址

#define VA_ARG(args, type) ( *(type*) ( (args += sizeof (type) ) -  sizeof (type) )  )      // 提取可变参数类型的值

#define VA_END(args) ( args = nullptr)      // 可变参包结束了


int myPrintf(const char* format, ...) {

    if (format == nullptr) {
        return -1;
    }

    char* start = nullptr;
    
    VA_START(start, format);

    for (const char* pos = format; *pos != '\0'; ++pos) {

        if (*pos != '%') {
            cout << *pos;
            continue;
        }

        ++pos;

        switch (*pos) {
            
            case 'd': {
                cout << VA_ARG(start, int);
                break;
            }

            case 'f': {
                cout << VA_ARG(start, double);
                break;
            }

            case 's': {
                cout << VA_ARG(start, char*);
                break;
            }
        
            default: {
                cout << (char)VA_ARG(start, int);
                break;
            }
        }
    }

    VA_END(start);

    return 0;
}



int main(void)
{
   myPrintf("%c %s", 'A', "hello word");
}

你可能感兴趣的:(C/C++语法篇)