2012-02-22 11 views
5

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"; 
+0

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 ... –

+2

Po prostu z ciekawości, gdzie spotkałeś tę małą obrzydliwość? –

Odpowiedz

6

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 *)

+0

W twoim środowisku tak, ale uważam, że "VARNAME" jest zdefiniowany w kodzie OP. – moose

+2

To nawet niebezpieczne, ponieważ 'sizeof (int)' może być mniejsze niż 'sizeof (char *)'. –

+0

Może to działać doskonale na twoim pudełku, ale przechowywanie wskaźnika w 'int' ma zdefiniowane przez implementację zachowanie. –

0

Znajdź definicję "VARNAME", a zobaczysz. Powiedziałbym coś w rodzaju "char *".

2

Co próbuje GCC zrobić to:

  1. Stwórz stały VARNAME z domyślnym typem, czyli int;
  2. sprawiają, że ta stała 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