Teknik olarak, nasıl variadic fonksiyonlar çalışıyor mu? Ne kadar basit bir beşgen kullanmaktır çalışır?
va_arg
kendi variadic fonksiyonlar yazmak benim için kullanabilirim biliyorum ama nasıl variadic fonksiyonlar başlık altında iş yapmak, yani Meclis öğretim düzeyinde?
E. g., nasıl printf
bağımsız değişken bir dizi alır.
CEVAP
C ve C standart işe yaramalı konusunda herhangi bir gereksinimi yoktur. Uygun bir derleyici de zincirleme listeleri, std::stack<boost::any>
hatta büyülü Midilli toz (başına Xeo gibi) yaymak için kaputun altında karar verebilir.
Ancak, genellikle CPU kayıtlarında bağımsız satır içi uygulaması geçirilmesi gibi dönüşümler ele kodun hiç bir şey olmasa bile aşağıdaki gibi uygulanır.
Ayrıca bu cevap özellikle bir aşağı aşağıda görseller yığın büyüyen açıklar; ayrıca, bu cevap sadece düzeni (https://en.wikipedia.org/wiki/Stack_frame bakınız) göstermek için bir sadeleştirilmesi olduğunu unutmayın lütfen.
Nasıl bir işlev bağımsız değişken sabit olmayan bir sayı ile çağrılabilir
Bu temel makine mimarisi sözde "" her iş parçacığı için. bir yığın olduğundan mümkün Yığın, işlev için bağımsız değişken geçirmek için kullanılır. Varsa, örneğin,:
foobar("%d%d%d", 3,2,1);
O zaman bu böyle bir çevirici kodu derler (örnek ve şematik olarak, gerçek kodu farklı olabilir); argümanlar soldan sağa geçirilen not:
push 1
push 2
push 3
push "%d%d%d"
call foobar
Bu push-up işlemleri yığın doldurun:
[] // empty stack
-------------------------------
push 1: [1]
-------------------------------
push 2: [1]
[2]
-------------------------------
push 3: [1]
[2]
[3] // there is now 1, 2, 3 in the stack
-------------------------------
push "%d%d%d":[1]
[2]
[3]
["%d%d%d"]
-------------------------------
call foobar ... // foobar uses the same stack!
Element denir "Top", genellikle kısaltılmış"". TOS Yığını altında yığını
foobar
işlevi şimdi, TOS başlayarak yığın hatırlayacağınız gibi son itilmiş olan, yani biçim dizesi, erişim. stack
hayal işaretçiyi TOS değeri , stack[1]
TOS yukarıdaki ve benzeri yığını
format_string <- stack[0]
... ve sonra ayrıştırır format-string. Ayrıştırılırken, recognozies %d
-belirteçleri, ve her biri için, bir daha değer yığın: loads
format_string <- stack[0]
offset <- 1
while (parsing):
token = tokenize_one_more(format_string)
if (needs_integer (token)):
value <- stack[offset]
offset = offset 1
...
Bu tabii ki işlev bağımsız geçti güvenmek ne kadar yığından yükü kaldırmak için bunu bulmak için nasıl gösteren bir çok eksik pseudo-kod.
Güvenlik
Kullanıcı tarafından sağlanan bağımsız değişkenler bu güven aynı zamanda en büyük güvenlik sorunları mevcut (https://cwe.mitre.org/top25/ bkz. Kullanıcıların kolayca belgeleri okumak onlar için variadic bir işlevi yanlış da kullanabilir, ya da format string veya değişken listesi ayarlamak için unuttum, ya da düpedüz kötü oldukları için, ya da her neyse. Ayrıca Format String Attack bkz.
C Uygulanması
C ve C , variadic fonksiyonlar bir arada va_list
arabirim ile kullanılır. Süre iterek üzerine yığın iç için bu dil (in K R C you could even forward-declare a function without stating its arguments ama hala arayacak herhangi bir sayı ve tür bağımsız değişkenleri), okuma gibi bir bilinmeyen değişken listesi arabirim üzerinden va_...
-makrolar va_list
tipi, hangi temelde özetleri düşük seviye yığın çerçevesini erişim.
Nasıl Haskell, basit bir beşgen kullan...
Ne kadar basit bir beşgen kullanmaktır...
Nasıl C % işareti'in, basit bir b...
nasıl uint64_t, basit bir beşgen kulla...
JavaScript, basit bir beşgen kullanmak...