Potknął się na tym wierszu kodu c, ale nie był pewien, czy jest ważny, czy nie. Co to robi? Jaki będzie typ zmiennej?Co robi ten wiersz kodu C? (const VAR = "string";)
const VARNAME = "String of text";
Potknął się na tym wierszu kodu c, ale nie był pewien, czy jest ważny, czy nie. Co to robi? Jaki będzie typ zmiennej?Co robi ten wiersz kodu C? (const VAR = "string";)
const VARNAME = "String of text";
Co ciekawe, nie spodziewałem się, że to się skompiluje, ale tak jest. Jednak kompilator nie lubi zbyt dużo:
..\main.c:4:7: warning: type defaults to 'int' in declaration of 'VARNAME'
..\main.c:4:17: warning: initialization makes integer from pointer without a cast
Więc to bierze int jako domyślnego typu, a tym samym VARNAME ma wartość wskaźnika, ponieważ ciąg jest wskaźnik (który później może być obsadzony w roli char *).
To działa doskonale (na maszynie Intel IA32):
#include<stdio.h>
const VARNAME = "String of text";
int main()
{
printf("%s\n", (char*)VARNAME);
return 0;
}
Ale ja osobiście nie użyłby takiego niejawny wpisywanie. Jak wyjaśniono w komentarzach poniżej:
to nawet niebezpieczne, ponieważ sizeof (int) może być mniejsza niż sizeof (char *)
W twoim środowisku tak, ale uważam, że "VARNAME" jest zdefiniowany w kodzie OP. – moose
To nawet niebezpieczne, ponieważ 'sizeof (int)' może być mniejsze niż 'sizeof (char *)'. –
Może to działać doskonale na twoim pudełku, ale przechowywanie wskaźnika w 'int' ma zdefiniowane przez implementację zachowanie. –
Znajdź definicję "VARNAME", a zobaczysz. Powiedziałbym coś w rodzaju "char *".
Co próbuje GCC zrobić to:
VARNAME
z domyślnym typem, czyli int
;int
zawiera wskaźnik do stałej znaków.Na moim komputerze nie kompiluje się, prawdopodobnie dlatego, że int
ma 32 bity, a wskaźniki mają szerokość 64 bitów.
a.c:1: error: initializer element is not computable at load time
nadzieja w [link1] (http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html) [link2] (http://www.tutorialspoint.com/ansi_c/c_using_constants .htm) pomaga ... –
Po prostu z ciekawości, gdzie spotkałeś tę małą obrzydliwość? –