2015-06-10 4 views
-1

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); 
    //... 
} 

Edit 2: Некоторые дополнительные код необходим для воспроизведения предупреждения «„MYVAR“может быть использована неинициализированным в этой функции». Кроме того, вам необходимо передать -Wall -O1 в gcc.

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

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

Хотите указатели? Как 'void func (int * i) {* i = 44;}' (C)? –

+1

C и C++ - разные языки. В C++ вы должны использовать ссылки, на C у вас есть только указатели. – szczurcio

+0

Мне нужен дополнительный атрибут, чтобы отметить аргумент ptr/ref как только. Я обновил свой вопрос, чтобы заявить об этом. –

ответ

5

"Is it possible to do something similar in C/C++?"

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

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

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

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

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

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

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

Обратите внимание, что между параметрами 'out' и' in & out' нет различий. – Jarod42

+0

Если вы не используете 'const', как описано в другом ответе;) – szczurcio

+0

Мне нужен дополнительный атрибут, чтобы отметить аргумент ptr/ref как только. Я обновил свой вопрос, чтобы заявить об этом. –

0

Когда вы хотите передать ARG как вывод на C++ вы передаете его в качестве ссылки:

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

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

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

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

Мне нужен дополнительный атрибут для отметки ptr/ref аргумент как только. Я обновил свой вопрос, чтобы заявить об этом. –

+0

Вы просто не можете, вы можете просто указать только вход, а не только вывод – Bastien

 Смежные вопросы

  • Нет связанных вопросов^_^