【问题标题】:How to mark function argument as output如何将函数参数标记为输出
【发布时间】:2015-08-25 11:07:42
【问题描述】:

C# 允许将函数参数标记为仅输出:

void func(out int i)
{
    i = 44;
}

是否可以在 C/C++ 中做类似的事情?这可以改进优化。此外,当变量未初始化然后作为输出参数传递给函数时,应该消除警告“错误:'myVar'可能在此函数中未初始化使用”。

我使用 gcc/g++(目前是 4.4.7)来编译我的代码。

编辑:我知道指针和引用,这不是我要找的。我需要这样的东西:

void func(int* __attribute__((out)) i)
{
    *i = 44;
}

void func2()
{
    int myVal; // gcc will print warning: 'myVar' may be used uninitialized in this function
    func(&myVal);
    //...
}

编辑 2: 需要一些额外的代码来重现警告“'myVar' may be used in uninitialized in this function”。此外,您必须将 -Wall -O1 传递给 gcc。

void __attribute__((const)) func(int* i)
{
    *i = 44;
}

int func2()
{
    int myVal; // warning here
    func(&myVal);
    return myVal;
}

【问题讨论】:

  • 你想要指针吗?喜欢void func(int* i){*i = 44;} (C)?
  • C 和 C++ 是不同的语言。在 C++ 中你应该使用引用,在 C 中你只有指针。
  • 我需要额外的属性来将 ptr/ref 参数标记为仅输出。我更新了我的问题以说明这一点。
  • 我的 g++ does not warn anything 即使带有 -Wall -Wextra -pedantic 标志,即使 myVal 用于 func2。我假设您打算将myVal 的地址传递给func
  • 已经用__attribute__((const)) 对编译器撒了谎,它承诺了函数"does not examine any values except its arguments, and has no effects except the return value",你现在抱怨编译器被谎言愚弄了?

标签: c++ c gcc attributes out


【解决方案1】:

“是否可以在 C/C++ 中做类似的事情?”

不是真的。标准 c++ 或 c 不支持仅输出参数之类的东西。

在 c++ 中,您可以使用引用参数来获取输入/输出语义:

void func(int& i) {
          // ^
    i = 44;
}

对于 c 你需要一个指针来做同样的事情:

void func(int* i) {
          // ^ 
    *i = 44;
 // ^
}

请注意,outin&out 参数之间没有区别,除非您使用 const 引用(这意味着仅输入):

void func(const int& i) {
       // ^^^^^
    i = 44;
}

【讨论】:

  • 请注意outin&out 参数之间没有区别。
  • 除非您使用const,如另一个答案中所述;)
  • 我需要额外的属性来将 ptr/ref 参数标记为仅输出。我更新了我的问题以说明这一点。
  • @DanielFrużyński “我需要额外的属性来将 ptr/ref 参数标记为仅输出。” 你根本不能在标准 c++ 或 c 中。
  • 我知道这一点,我正在寻找一些非标准的,可能只支持 gcc 的扩展。
【解决方案2】:

当您想在 C++ 中将 arg 作为输出传递时,您将其作为引用传递:

 void func(int &i)
{
    i = 44;
}

并且您必须在对其进行任何操作之前对其进行初始化。

注意: 您可以指定何时希望 arg 只是带有 const ref 的 input

 void func(const int &i)
{
    i = 44;
}

【讨论】:

  • 我需要额外的属性来将 ptr/ref 参数标记为仅输出。我更新了我的问题以说明这一点。
  • 你不能,你只能指定一个输入,而不是一个输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2013-11-09
  • 2022-06-29
相关资源
最近更新 更多