Как пометить аргумент функции как вывод

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» может использоваться неинициализированным в этой функции ». Кроме того, вы должны передать -Wall -O1 в gcc.

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

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

2

Решение

«Возможно ли сделать что-то подобное в C / C ++?»

На самом деле, нет. Стандартный c ++ или c не поддерживает такую ​​вещь, как выходной параметр.

В C ++ вы можете использовать ссылочный параметр для получения семантики ввода / вывода:

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

Для c вам нужен указатель, чтобы сделать то же самое:

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

Обратите внимание, что нет никаких различий между out а также in&out параметры, если вы не используете const ссылка (что означает только ввод):

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

Другие решения

Когда вы хотите передать arg как вывод в C ++, вы передаете его как ссылку:

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

и ты должен инициализировать его, прежде чем делать что-либо на нем.

Заметка :
Вы можете указать, когда вы хотите, чтобы arg был просто вход с продолжением:

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

По вопросам рекламы [email protected]