标签: variadic-functions

如何在 varargs 构造函数的初始值设定项列表中初始化向量?

我需要详细说明以下类的构造函数:

class Foo {
public:
    const std::vector<Bar> bars;
    Foo(int num_bars, ...);
}
Run Code Online (Sandbox Code Playgroud)

为了讨论的方便,假设额外的参数是 allconst Bar&或 just Bar

我需要使用 va_list 中的条来初始化 v 的构造。我怎样才能做到这一点?

c++ constants vector variadic-functions initializer-list

3
推荐指数
1
解决办法
308
查看次数

如何编写自定义printf?

我有个问题。我尝试进行自定义printf(),但是当我编译此代码时,输​​出似乎没有按预期出现。

#include <stdio.h>
#include <stdarg.h>
void print(char *, ...);

int main()
{
    char str[12]="World";
    char c='A';
    int i=100;
    print("Hello %s %c", str, c);
}

void print(char *c, ...)
{
    char *s;
    va_list lst;
    va_start(lst, c);
    while(*c!='\0')
    {
        if(*c!='%')
        {
            putchar(*c);
            c++;
            continue;
        }
        c++;
        switch(*c)
        {
        case 's': fputs(va_arg(lst, char *), stdout); break;
        case 'c': putchar(va_arg(lst, int)); break;
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

输出似乎是:Hello World 输出:Hello Worlds Ac 我不明白为什么会出现 's, c'。

c variadic-functions

3
推荐指数
1
解决办法
1万
查看次数

用自定义条件包装 printf

如果某些条件为真,我只想打印 printf。我知道 printf 是一个可变参数函数,但遗憾的是我似乎无法在这里找到任何解释我可以包装它的线程。

基本上我写的代码中的每一个:

printf(" [text and format] ", ... args ...);
Run Code Online (Sandbox Code Playgroud)

我想写一些类似的东西

my_custom_printf(" [text and format] ", ... args ...);
Run Code Online (Sandbox Code Playgroud)

然后是这样实现的:

int my_custom_printf(const char* text_and_format, ... args ...)
{
    if(some_condition)
    {
        printf(text_and_format, ... args...);
    }
}
Run Code Online (Sandbox Code Playgroud)

条件的第一个版本将独立于 args(它将在某个全局变量上),但将来可能会成为需要的条件一个参数。

无论如何,现在我只需要... args ...原型中的语法和my_custom_printf.

我正在使用 GCC,但我不知道哪个 C 标准 - 但我们可以尝试一下。

c customization printf variadic-functions

3
推荐指数
1
解决办法
274
查看次数

...(省略号)作为函数原型中唯一的函数参数在 C++ 中意味着什么?

I\xc2\xb4ve 遇到了一个函数声明,例如:

\n\n
int vsa_d(...);\n
Run Code Online (Sandbox Code Playgroud)\n\n

...一个且唯一的参数。

\n\n

我知道通过省略号,我们可以指代多个对象,但是指代的是什么?...这里指的是什么呢?

\n\n
    \n
  • 这意味着什么以及它的目的是什么?

  • \n
  • 到什么...编译器评估

  • \n
  • 在调用函数时,省略号也可以用作函数参数吗?

  • \n
\n\n
\n\n

我\xc2\xb4ve在“注释”下找到了https://en.cppreference.com/w/cpp/language/variadic_arguments

\n\n
\n

在C编程语言中,省略号参数之前必须至少出现一个命名参数,因此 printz(...); 无效。在 C++ 中,即使传递给此类函数的参数不可访问,也允许这种形式,并且通常用作 SFINAE 中的后备重载,利用重载决策中省略号转换的最低优先级。

\n
\n\n

因此,它应用于“ SFINAE”中的“后备过载”之类的情况”之类的情况。

\n\n

这意味着什么?

\n

c++ function ellipsis variadic variadic-functions

3
推荐指数
1
解决办法
1301
查看次数

使用 va_copy 有什么意义?

我读了一点关于 C/C++ 中的可变参数函数,我发现一个线程提到在 GCC 中重用 va_list 你需要使用它的副本和 va_copy 并且在他们建议的同一个线程上定义它

#define va_copy(d,s) ((d) = (s)) 这意味着它只是将 va_list s 的值分配给 va_list d。

改用它va_list ap1 = va_list ap不是更易读吗?创建另一个名为 va_copy 的函数有什么意义?

c c++ variadic-functions

3
推荐指数
1
解决办法
485
查看次数

使用 std::forward 进行参数包扩展的“...”语法

在C++中,似乎参数通常可以...直接在参数包名称之后扩展。例如,

template <class... Tys>
void function(Tys... params) {
    function(params...);
}
Run Code Online (Sandbox Code Playgroud)

然而,当使用 时std::forward...看起来似乎在参数包名称后面。例如,

template <class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params)...); // The '...' is outside the parenthesis of 'params'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么会有差异?为什么下面的代码不正确?

template<class... Tys>
void function(Tys... params) {
    function(std::forward<Tys>(params...));
}
Run Code Online (Sandbox Code Playgroud)

参数包在什么时候展开?我可能不完全理解它是如何std::forward工作的或者它如何完美地转发论点。

我很感激任何答案!

c++ templates variadic-functions variadic-templates perfect-forwarding

3
推荐指数
1
解决办法
863
查看次数

PowerShell 传递函数中接收到的所有参数,并处理带空格的参数

我是 PowerShell 的新手。在 Msys2(或 Lnux)中,我定义了一个函数npp

npp ()
{
    ${NPP_PATH} "$@"
}
Run Code Online (Sandbox Code Playgroud)

这样,如果我从命令提示符调用,npp它会启动 Notepad++(如 中所定义${NPP_PATH})。如果我调用npp "mydir/stage 1/a.txt"它会打开该文件进行编辑。一般来说,它允许:

  1. 任意数量的参数。
  2. 包含空格的参数,如果适当转义。

PowerShell 中的等价物是什么?

我想在 PS 我也应该去寻找一个函数来获得类似的行为。到目前为止,我可以接收未定义数量的参数,并在foreach循环中使用它们,请参阅下面的代码。但是我找不到简单的等价物"$@"来传递接收到的所有参数。此外,如果我在其中一个参数中使用引号,它们将被删除,因此文件路径可能会出现问题,包括空格。

function multi_params {
    param(
        [Parameter(
            ValueFromRemainingArguments=$true
        )][string[]]
        $listArgs
    )
    $count = 0
    foreach($listArg in $listArgs) {
        '$listArgs[{0}]: {1}' -f $count, $listArg
        $count++
    }
}
Run Code Online (Sandbox Code Playgroud)

parameters powershell function variadic-functions

3
推荐指数
1
解决办法
1309
查看次数

printf 以多个指针作为 C 中的参数

printf()当我们在没有格式说明符的情况下向它提供多个参数时,它的行为是什么?

例子:

int main() 
{
    printf("hello", "hi");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器在编译上述程序时会产生警告?:

warning: too many arguments for format [-Wformat-extra-args]
Run Code Online (Sandbox Code Playgroud)

如果我们编译如下类似的程序:

int main() 
{
    char *s1 = "hello";
    char *s2 = "hi";
    printf(s1, s2);
}
Run Code Online (Sandbox Code Playgroud)

不产生警告。这是什么原因?

另外,为什么两个程序hello都只输出而不打印hi

c printf variadic-functions language-lawyer format-string

3
推荐指数
1
解决办法
141
查看次数

在开始时调用带有 va_list 参数的函数需要 va_start() 吗?

具有以下标头的函数:

int max(int n, va_list vals)
Run Code Online (Sandbox Code Playgroud)

在函数内部调用:

int max_first(int n, ...)
Run Code Online (Sandbox Code Playgroud)

需要va_start(vals, n)在身体开始时调用吗?我试过没有,它有效,但我不明白哪种是正确的做法。

int max(int n, va_list vals)
{
    va_start(vals, n);
    // etc
}
Run Code Online (Sandbox Code Playgroud)

c c99 variadic-functions

3
推荐指数
1
解决办法
219
查看次数

如何在 C++ 中专门化一个可变参数模板函数?

让函数 foo 带有以下“签名”:

template<typename ...Ts>
void foo(Ts ...args)
Run Code Online (Sandbox Code Playgroud)

这有点过头了,因为我只需要 foo 来处理doubles。如何修改 foo 使其double仅接受s ?

原始代码已被Godbolted:

#include <tuple>
#include <iostream>

template<typename ...Ts>
void foo(Ts ...args)
{
    std::tuple<Ts...> tu(args...);
    std::apply([](Ts const&... tupleArgs)
        {
            ((std::cout << tupleArgs << " "), ...);
        }, tu);
}

int main()
{
    foo(-2.44, -5.66, 78.99);
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

-2.44 -5.66 78.99

c++ variadic-functions specialization c++20

3
推荐指数
1
解决办法
102
查看次数