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

8cdiaqws  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(192)

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 uninitialized in this function”。此外,您必须将-Wall -O 1传递给gcc。

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

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

cgyqldqp

cgyqldqp1#

  • “是否可以在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;
}

sqyvllje

sqyvllje2#

当你想在C++中传递一个arg作为输出时,你可以将它作为引用传递:

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

字符串
你必须在对它做任何事情之前对它进行初始化。

  • 注意 *:您可以指定何时希望arg只是一个带有const ref的input
void func(const int &i)
{
    i = 44;
}

qlckcl4x

qlckcl4x3#

正如其他人所指出的,你可以使用指针或引用来传递参数。但是没有办法注解它是inout还是in/out

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 Source-code Annotation Language (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);

相关问题