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;
}
«Возможно ли сделать что-то подобное в 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;
}
Когда вы хотите передать arg как вывод в C ++, вы передаете его как ссылку:
void func(int &i)
{
i = 44;
}
и ты должен инициализировать его, прежде чем делать что-либо на нем.
Заметка :
Вы можете указать, когда вы хотите, чтобы arg был просто вход с продолжением:
void func(const int &i)
{
i = 44;
}