Słowo kluczowe const (C/C++) – Kiedy przekazuje się stałe do funkcji

Jeżeli ktoś potraktował moje rady, bardzo surowo może natrafić na problem który dzisiaj omówię.
W poprzednim poście opisywałem taki przypadek:

#include <stdio.h>
int fun(int* x)
{
return 2*(*x);
}

int main(void)
{
int a = 5;
printf("%d n", fun(&a));
return 0;
}

Wszystko działa poprawnie, gdyż korzystamy z zmiennej a. Jednak problem się pojawia gdy chcemy do funkcji przekazać stałe wyrażenie, tak aby pominąć użycie zmiennej.

#include <stdio.h>
int fun(int* x)
{
return 2*(*x);
}

int main(void)
{
printf("%d n", fun(5));
return 0;
}

Kompilator zgłasza błąd ponieważ do funkcji fun trzeba podać adres a nie wartość. A nie można wyciągnąć adresu za pomocą operatora '&’.

Są dwa sposoby na ominięcie tego problemu:

  • przekazywać do funkcji wartość nie wskaźnik
  • skorzystanie z C++ i jego możliwości przekazywania argumentów jako referencji

Działający kod wyglądałby tak:

#include <stdio.h>
int fun(const int& x)
{
return 2*x;
}

int main(void)
{
int a = 5;
printf("%d n", fun(5));
return 0;
}

Bardzo ważne jest słowo kluczowe 'const’ wewnątrz paramentu w funkcji. Bez tego kompilator (Visual Studio 2011) będzie zgłaszał błąd o treści:

error C2664: 'fun’ : cannot convert parameter 1 from 'int’ to 'int &’