2016-07-20 13 views
14

Przykładem printk wezwanie:Dlaczego funkcja printk() nie używa przecinka do rozdzielania parametrów?

printk(KERN_INFO "Log message.\n"); 

Być może to pytanie jest więcej o C w ogóle, bo nigdy nie widziałem wcześniej funkcję w C, która oddzielała parametrów bez przecinka.

Jak to działa? Co robi kompilator z tymi informacjami? Ponieważ poziom dziennika jest liczbą całkowitą, a komunikat jest wskaźnikiem do tablicy char, musi on przekazywać je osobno.

+2

kompilator obsługiwane ciągach w konkatenacji. Spójrz na definicję 'KERN_INFO'. Nie robię jądra, ale założę się, że jest to literał łańcuchowy '# define' – WhozCraig

+2

@WhozCraig: Łańcuchowe dosłowne ciągi nie są obsługiwane tylko przez kompilator. Jest zdefiniowany przez język i istnieje od 1989. –

+6

Zauważ, że wiele argumentów * jest * oddzielonych przecinkami: 'printfk (KERN_INFO" n =% d \ n ", n);'. Łańcuch formatu 'KERN_INFO" n =% d \ n "' jest pierwszym argumentem, a 'n' jest drugim. –

Odpowiedz

20

Funkcja printk() przyjmuje tylko jeden argument const char*. W KERN_INFO za makro do "\001" "6", otrzymując:

printk("\001" "6" "Log message.\n"); 

C lexer skleja sąsiedztwie ciągach w znaki, co oznacza, że ​​ powyżej przekształca się:

printk("\0016Log message.\n"); 
+1

Dziękuję. Widziałem, że poziomy logów w nagłówku były liczbami i brakowało, że były to ciągi literowe. Musiałem również trochę odświeżyć o tym, w jaki sposób C łączy ciągi literałów oddzielone spacją. – elBradford

7

Poziom dziennika nie jest liczbą całkowitą, lecz literałem łańcuchowym. Literały łańcuchowe obok siebie są łączone w jeden ciąg literału podczas kompilacji.

5

Bo jeśli przeszukasz pliki nagłówkowe, zobaczysz np. KERN_INFO to makro rozwijane jako literał łańcuchowy (w rzeczywistości wiele literałów łańcuchowych, patrz np. Powiązane odniesienie krzyżowe), a dwa literały łańcuchowe obok siebie nawzajem, które są łączone w jeden ciąg literału przez kompilator.

więc wywołanie

printk(KERN_INFO "Log message.\n"); 

nie jest wywołanie funkcji z wieloma argumentami, to wywołanie funkcji z pojedynczego łańcucha dosłownym argument.

Powiązane problemy