Como o operando do sizeof
operador não é avaliado, você pode fazer isso:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Demonstração on-line: http://ideone.com/S8e2Y
Ou seja, você não precisa definir a função f
se ela for usada sizeof
apenas. Essa técnica é usada principalmente na metaprogramação de modelos C ++, pois mesmo em C ++, o operando de sizeof
não é avaliado.
Por que isso funciona? Funciona porque o sizeof
operador não opera com valor , mas com o tipo de expressão. Portanto, quando você escreve sizeof(f())
, ele opera com o tipo de expressão f()
e que nada mais é do que o tipo de retorno da função f
. O tipo de retorno é sempre o mesmo, independentemente do valor que a função retornaria se realmente fosse executada.
No C ++, você pode até isso:
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
No entanto, parece que, sizeof
primeiro, eu estou criando uma instância de A
, escrevendo A()
e depois chamando a função f
na instância, escrevendo A().f()
, mas isso não acontece.
Demonstração: http://ideone.com/egPMi
Aqui está outro tópico que explica algumas outras propriedades interessantes de sizeof
: