2009-12-30 8 views
12

Podejmowane dosłownie ma sens, ale co to znaczy być znaczącą postacią nazwy zmiennej?(K & R) Co najmniej pierwsze 31 znaków nazwy wewnętrznej jest znaczące?

jestem początkujący uczeń C używając K & R. Oto cytat z książki:

„Przynajmniej 31 pierwszych znaków z nazwy wewnętrznej są istotne dla nazw funkcji i zewnętrznych. zmienne, liczba może być mniejsza niż 31, ponieważ nazwy zewnętrzne mogą być używane przez asemblery i ładowarki, nad którymi język nie ma kontroli.W przypadku nazw zewnętrznych, standard gwarantuje tylko 6 znaków i pojedynczy przypadek. "

Nawiasem mówiąc, co to znaczy "pojedynczy przypadek"?

+0

Jeśli dopiero zaczynasz C, czemu chcą wiedzieć K & R? Ansi C89/99 jest znacznie bardziej "normalny" i popularny. – Earlz

+0

Nie byłem pewien, którą książkę kupić, aby się uczyć C. Powiedziano mi, że K & R może nauczyć mnie programowania w C, ale jak na razie wydaje mi się, że czasami trudno to zrozumieć. Wydaje się być trochę niejasna, pełna zwięzłości i zaawansowanego żargonu. Mogę się jednak mylić ... – withchemicals

+3

"K & R C" był oryginalnym, obecnie przestarzałym dialektem C wprowadzonym przez pierwszą edycję książki K & R. Oczekuję (i mam nadzieję!), Że faktycznie masz drugą edycję K & R, która obejmuje ANSI C. Jest to świetna książka, ale od tego czasu pojawiły się kolejne wersje standardu ANSI C. Zmiany nie są ogromne, ale warto o tym wiedzieć. Otrzymujesz teraz nowe typy, takie jak booleans i long-longs, i tak, granice crazy-short identifier są znacznie podwyższone. – bobince

Odpowiedz

18

Pojedynczy przypadek oznacza zwykle "małe litery". Z wyjątkiem niektórych systemów operacyjnych, gdzie oznacza to "wielkie litery". Chodzi o to, że nie można zagwarantować, że mieszany przypadek nie zadziała.

abcdef 

ABCDEF 

różnią się tylko na wszelki wypadek. To nie gwarantuje działania.

Zagadnienie "istotności" jest jednym z tego, ile liter może być takich samych.

Załóżmy, że mamy tylko 6 znaczących znaków.

a_very_long_name 

a_very_long_name_thats_too_similar 

Wyglądają inaczej, ale pierwszych 16 znaków jest takich samych. Ponieważ tylko 6 jest znaczących, są to te same zmienne.

+0

Jesteś niesamowity! Tak więc upewniając się, czy to cytuję: "W przypadku nazw zewnętrznych, standard gwarantuje tylko 6 znaków i pojedynczy przypadek."" oznacza, że ​​AbCDeF i abcdef oraz ABCDEF nie są w 100% gwarantowane jako różne zmienne? Ponadto, jako początkujący programista, powinienem się martwić o to, co wspomniano o "asemblerach i ładowarkach"? – withchemicals

+2

Prawidłowo. Rzeczy, które różnią się tylko przypadkiem, nie są GWARANTOWANE do działania. Mogą działać, ale to jest wypadek. W najbliższym czasie nie będziesz używać asemblera. Twój program ładujący jest częścią systemu operacyjnego. Większość programów ładujących obsługuje bardzo długie nazwy. Kiedy byłem programistą n00b (w latach 80-tych), 6-znakowy program był poważny w niektórych systemach operacyjnych. Dla standardowych systemów operacyjnych (Linux, MacOS itp.) Bez obaw. Dla Windows prawie bez obaw. –

2

Oznacza to, że:

foobar1 
foobar2 

może być taka sama nazwa zewnętrzny, bo tylko pierwsze 6 znaków musi być brane pod uwagę. Pojedynczy przypadek oznacza, że ​​nie należy rozróżniać wielkich i małych liter.

Należy pamiętać, że prawie wszystkie współczesne łączniki będą uwzględniały znacznie dłuższe nazwy, ale nadal będzie istniał limit zależny od łącznika.

3

To po prostu oznacza, że ​​jeśli masz dwie zmienne o nazwach

abcdefghijklmnopqrstuvwxyz78901A,

i

abcdefghijklmnopqrstuvwxyz78901B,

że nie ma gwarancji, że będzie traktowany jako różnych, oddzielnych zmiennych. ..

5

Oznacza to, czego się obawiasz. W przypadku nazw zewnętrznych, standard C w tym czasie K & R 2nd ed. został napisany tak naprawdę daje tylko sześć znaków niewrażliwych na wielkość liter! Więc nie możesz mieć afoobar i aFooBaz jako niezależnych podmiotów.

To absurdalne ograniczenie (które miało już dawno zająć się starszymi linkerami) nie ma już większego znaczenia dla żadnego środowiska. Standard C99 oferuje 31 znaków z rozróżnianiem wielkości liter dla zewnętrznych nazw i 63 wewnętrzne, a powszechnie używane łączniki w praktyce obsługują znacznie dłuższe nazwy.

0

G'day,

Jednym z problemów z tej ograniczonej rozdzielczości symbol pojawia się w momencie połączenia.

Wiele symboli o tej samej nazwie może istnieć w kilku bibliotekach, a edytor linków zwykle zajmuje tylko pierwsze znalezione pasujące do poszukiwanego elementu.

Używając powyższego przykładu S.Lott, jeśli twój edytor linków szuka symbolu "a_very_long_name" i znajduje bibliotekę na swojej ścieżce wyszukiwania, która zawiera symbol "a_very_long_name_thats_too_similar", zajmie to. Stanie się tak, nawet jeśli w twoim poleceniu została określona biblioteka zawierająca żądany symbol, tj. "A_very_long_name". Na przykład, określając biblioteki jako:

-L/my/library/path -lmy_wrong_lib -lmy_correct_lib 

Obecnie opcje kompilatora, lub bardziej poprawnie skompilować opcji czasowych, które są przekazywane za pośrednictwem łącza do edytora, który egzekwowania poszukiwania wielu symboli w ścieżce łącza. Są one zwykle zgłaszane jako błędy w czasie połączenia.

Ponadto wiele kompilatorów, np. gcc, domyślnie będzie takie zachowanie. Musisz wyraźnie włączyć wiele definicji, aby umożliwić edytorowi linków kontynuację bez zgłaszania błędu krytycznego, jeśli znajdzie wiele definicji dla symbolu.

BTW Gorąco polecam pracę nad ćwiczeniami w połączeniu z książką Clovis Tondo "The C Answer Book 2nd ed.".

Takie postępowanie naprawdę pomaga w utrzymaniu C w pamięci.

HTH

okrzyki,

Powiązane problemy