C# permite marcar el argumento de la función solo como salida:
void func(out int i) { i = 44; }
¿Es posible hacer algo similar en C/C++? Esto podría mejorar la optimización. Además, debe silenciar las advertencias "error: 'myVar' puede usarse sin inicializar en esta función", cuando la variable no se inicializa y luego se pasa a la función como argumento de salida.
Uso gcc/g++ (actualmente 4.4.7) para compilar mi código.
Editar: sé sobre punteros y referencias, esto no es lo que estoy buscando. Necesito algo como esto:
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); //... }
Edición 2: se necesita algún código adicional para reproducir la advertencia "'myVar' puede usarse sin inicializar en esta función". Adicionalmente tienes que pasar -Wall -O1 a gcc.
void __attribute__((const)) func(int* i) { *i = 44; } int func2() { int myVal; // warning here func(&myVal); return myVal; }
"¿Es posible hacer algo similar en C/C++?"
Realmente no. El estándar c++ o c no es compatible con un parámetro de solo salida.
En C++ puede usar un parámetro de referencia para entrar/salir de la semántica:
void func(int& i) { // ^ i = 44; }
Para c necesitas un puntero, para hacer lo mismo:
void func(int* i) { // ^ *i = 44; // ^ }
Tenga en cuenta que no hay distinciones entre out
parámetros in&out
, a menos que use una referencia const
(que significa solo entrada):
void func(const int& i) { // ^^^^^ i = 44; }
Cuando desee pasar un argumento como salida en C++, páselo como referencia:
void func(int &i) { i = 44; }
y debe inicializarlo antes de hacer nada en él.
Nota : puede especificar cuándo desea que el argumento sea solo una entrada con una referencia constante:
void func(const int &i) { i = 44; }