va_arg 以 mac 上的第二个参数开头(clang++)

lii*_*ght 0 c++ parameters macos arguments clang

编码

TextureMeta(string tex_, int args_, const char* ...)
{
    va_list vl;
    va_start(vl, args_);
    for (int i = 0; i < args_; i++)
    {
        string img_(va_arg(vl, char*));
        cout << img_ << endl;
        images.push_back(img_);
    }
    va_end(vl);
}
Run Code Online (Sandbox Code Playgroud)

在 MSVC 上它工作正常,但在 MacOS 上生成的应用程序出现分段错误,我可以看到代码首先打印第二个参数,日志TextureMeta(this=0x000000010174d680, tex_="resource/skybox/mitsuumi", args_=6, (null)="resource/skybox/mitsuumi/right.jpg")显示,第一个 va 参数似乎成为函数参数并且无法迭代。我使用 CMake,生成器是默认的。

这是一个mac clang错误吗?或者上面的代码中是否有一些未定义的标准?

Ayx*_*xan 6

TextureMeta(string tex_, int args_, const char* ...)
Run Code Online (Sandbox Code Playgroud)

这是简称

TextureMeta(string tex_, int args_, const char*,  ...)
Run Code Online (Sandbox Code Playgroud)

这意味着您在椭圆之前有 3 个常规参数。你想要的是:

TextureMeta(string tex_, int args_, ...)
Run Code Online (Sandbox Code Playgroud)

Live

  • 回答了我自己的问题:[cppreference](https://en.cppreference.com/w/cpp/utility/variadic) - “*要声明可变参数函数,参数列表后面会出现省略号,例如 `int printf( const char* 格式...);`,前面可以有一个可选的逗号*"。它通常位于命名参数之后,因此看到 `const char* ...` 看起来非常奇怪。 (2认同)