2015-03-06 4 views
0

Сегодня я получил некоторую информацию, которую мы можем получить смещение поля в структуре таким образом:Почему мы можем получить смещение такой структуры?

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 

struct sdshdr { 
    int len; 
    int free; 
}; 

int main(int argc, char* argv[]) 
{ 
    printf("%d\n", &sdshdr::len); 
    printf("%d\n", &sdshdr::free); 
} 

Хотя я получил предупреждение во время компиляции, он может успешно работать. Как мы можем это объяснить? Я не получал информацию, когда искал в Интернете. Может ли кто-нибудь помочь объяснить, что здесь произошло?

аргументы компиляции: gcc -g -O2 -Wall -o main.o main.cpp

+0

С каким флагом компилятора и какой компилятор вы строите эту программу? – Evert

+1

Nope, error: expected ')' before ':' token http://codepad.org/ZsNJY08g – duDE

+0

gcc -g -O2 -Wall -o main.o main.cpp – meeme

ответ

3

код вы показали не является C-совместимый код. Эти конструкции

&sdshdr::len и &sdshdr::free недействительны конструкции C.

Кажется, вы скомпилировали код как код на C++.

Если вы хотите знать, смещение элемента данных структуры в C, то вы должны использовать стандартный макрос offsetof заявленную в заголовке <stddef.h>

Например

выход
#include <stdio.h> 
#include <stddef.h> 

struct sdshdr { 
    int len; 
    int free; 
}; 


int main(void) 
{ 
    printf("offset of len is equal to %zu\n", offsetof(struct sdshdr, len));  
    printf("offset of free is equal to %zu\n", offsetof(struct sdshdr, free)); 

    return 0; 
} 

Программа может выглядеть

offset of len is equal to 0 
offset of free is equal to 4 

Если вы имеете в виду C++ то эти выражения

& sdshdr :: len and & sdshdr :: free` обозначает указатели на элементы данных внутри структуры.

+0

'Кажется, вы скомпилировали код как код C++.', Аргументы компиляции: 'gcc ...', для компиляции в виде кода на C++ вам нужно' g ++ ... ', не так ли? –

+1

@Alter Mann Я сам использую MS VC++. :) Но я вижу, что расширение программы - .cpp: main.cpp. Поэтому я уверен, что код скомпилирован как код на C++. –

+0

Oooops, изменил расширение с .c на .cpp и компилируется с предупреждениями, я не знал, что –

Смежные вопросы