如何将函数参数标记为输出

14

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

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

在C/C++中是否有类似的方法?这可以改善优化。此外,当变量未初始化并作为输出参数传递到函数时,“error:'myVar' may be used uninitialized in this function”警告应该被忽略。

我使用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'在此函数中可能未初始化”。此外,您需要将-Wall -O1传递给gcc。

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

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

1
C和C++是不同的编程语言。在C++中,你应该使用引用(references),而在C中,你只有指针(pointers)。 - user4520
我需要一个额外的属性来将指针/引用参数标记为仅输出。我已经更新了我的问题以说明这一点。 - Daniel Frużyński
纯粹出于好奇,你为什么需要这个? - undu
哦,为什么所有的投票都是负数? - undu
1
你曾经使用 __attribute__((const)) 欺骗编译器,承诺该函数“除了返回值之外不会检查任何值,也没有其他影响”(https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html),现在你抱怨编译器被欺骗了? - T.C.
显示剩余4条评论
3个回答

13

"在 C/C++ 中是否可能做类似的事情?"

实际上不行。标准的 C++ 或 C 并不支持像输出参数这样的东西。

在 C++ 中,你可以使用引用参数来获得输入/输出语义:

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

对于 c,你需要一个指针来执行同样的操作:

void func(int* i) {
          // ^ 
    *i = 44;
 // ^
}
请注意,除非使用const引用(仅表示输入),否则outin&out参数之间没有区别:
void func(const int& i) {
       // ^^^^^
    i = 44;
}

1
请注意,在“out”和“in&out”参数之间没有区别。 - Jarod42
我需要一个额外的属性来将指针/引用参数标记为仅输出。我已经更新了我的问题来说明这一点。 - Daniel Frużyński
@DanielFrużyński:“我需要一个额外的属性来将指针/引用参数标记为仅输出。”在标准的C++或C中是不可能的。 - πάντα ῥεῖ
我知道这点,我正在寻找一些非标准的,可能只有gcc支持的扩展。 - Daniel Frużyński
gcc已经实现了函数、变量和类型的附加属性。函数参数的属性可能看起来像这样:void func(int* __attribute__((out)) i)或者void func(__attribute__((out)) int* i) - Daniel Frużyński
显示剩余3条评论

2
当你想在C++中将一个参数作为输出时,你需要将它作为引用传递:
 void func(int &i)
{
    i = 44;
}

你必须在对其进行任何操作之前初始化它。

注意: 您可以使用const引用指定参数仅为输入

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

我需要一个额外的属性来将指针/引用参数标记为仅输出。我已经更新了我的问题来说明这一点。 - Daniel Frużyński
你不能仅指定输出,只能指定输入。 - Bastien

0
正如其他人所指出的那样,您可以使用指针或引用来传递参数。但是没有办法注明它是“输入”、“输出”还是“输入/输出”。
void func(int &i); // Out or in/out. Non-nullable.
void func(int *i); // Out or in/out. Nullable.
void func(const int &i); // In. Non-nullable.
void func(const int *i); // In. Nullable.

Microsoft编译器扩展

如果使用MSVC,Microsoft的源代码注释语言(SAL)可以提供此类注释,并进行编译时静态分析以强制调用者正确使用。

void func(_Out_ int &i);
void func(_Out_ int *i);
void func(_Out_opt_ int *i);
void func(_Inout_ int &i);
void func(_Inout_ int *i);
void func(_Inout_opt_ int *i);
void func(_In_ const int &i);
void func(_In_ const int *i);
void func(_In_opt_ const int *i);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接