Bir kod parçasıyla karşılaştım void *p = &&abc;
. Burada ne önemi &&
var? Rvalue referanslarını biliyorum ama &&
bu bağlamda farklı olduğunu düşünüyorum . Ne geliyor &&
belirtmek void *p = &&abc;
?
Bir kod parçasıyla karşılaştım void *p = &&abc;
. Burada ne önemi &&
var? Rvalue referanslarını biliyorum ama &&
bu bağlamda farklı olduğunu düşünüyorum . Ne geliyor &&
belirtmek void *p = &&abc;
?
Yanıtlar:
&&
gcc'nin mevcut işlevde tanımlanan etiketin adresini almak için uzantısıdır .
void *p = &&abc
standart C99 ve C ++ 'da yasa dışıdır.
Bu , g ++ ile derlenir.
void*
.
__forceinline
? __declspec(naked)
? En sevdiğim MSVCismlerden biri: template<typename T> class X { friend T; }
geçersiz olan C ++ 03.
Bu, bir etiketin adresidir ve GCC'ye özgü bir özelliktir .
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
Şunları test ederek kendiniz çözebilirdiniz:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
Bu durumda GCC şunları söyler:
hata: 'a' etiketi kullanılmış ancak tanımlanmamış
Bunu gerçekten anlamak için assembler'ı bilmeniz gerekir, ancak size bir etiketin adresinin ne anlama geldiğini açıklamaya çalışacağım.
İşletim sistemi .exe dosyasını diskten yükledikten sonra, işletim sisteminin "yükleyici" adı verilen bir bileşeni (Windows'ta "PE Yükleyici", linux'ta "ELF yükleyici" veya hatta başka dosyalar, kernel), o programın "sanallaştırılmasını" gerçekleştirerek onu bir işleme dönüştürür.
Bu işlem, RAM'deki tek olduğunu ve tüm RAM'e erişimi olduğunu düşünür (yani, 32 bitlik bir makinede 0x00000000-0xFFFFFFFF).
(yukarıdakiler neler olup bittiğine dair sadece kısa bir bakış, montajı tam olarak anlamak için gerçekten öğrenmeniz gerekiyor, bu yüzden bana katlanın)
Şimdi, bir kaynak koddaki etiket temelde bir adrestir. "etikete git;" bu adrese atlamaktan başka bir şey yapmaz ( assembly'deki komut göstericisini düşünün ). Bu etiket, bu RAM adresini saklar ve bu adresi bu şekilde öğrenebilirsiniz.
ASM'yi öğrendikten sonra, bu adresin .text
yürütülebilir dosyanın bölümündeki bir talimata işaret ettiğini fark edeceksiniz . .text
Bölüm yürütülecek size programın (ikili) kod tutan biridir.
Bunu şu şekilde inceleyebilirsiniz:
objdump -x a.out
GCC'de açıklandığı gibi , bunu bir atlama tablosunu başlatmak için kullanabilirsiniz. Re2c gibi bazı tarayıcı üreteçleri ( parametreye bakın ) bunu daha kompakt tarayıcılar oluşturmak için kullanır. Belki aynı tekniği kullanan bir ayrıştırıcı üreteci bile vardır .-g