Определение макросов в C и C ++ - PullRequest
0 голосов
/ 12 октября 2011

Я новый программист на C / C ++, давно программировал на Java.В настоящее время я понимаю некоторый C-код.Здесь я вижу некоторые определения макросов, такие как:

/* Flags for ds_flags */ 
#define DSF_OVER        (1<<0)  
#define DSF_DISPLAY     (1<<1)    
#define DSF_CALLFLOW    (1<<2) 

Я не могу понять, почему мы должны определять эти макросы таким образом.Каково преимущество, полученное в этих, а не в определении как:

#define DSF_OVER        0
#define DSF_DISPLAY     1    
#define DSF_CALLFLOW    2

Ответы [ 7 ]

7 голосов
/ 12 октября 2011

Когда видишь что-то вроде

#define DSF_FOO 0x800
#define DSF_BAR 2048

не многие люди могут быстро увидеть, что установлен только один бит и какой он есть.

#define DSF_FOO (1<<11)

однако делает это очень ясным.

5 голосов
/ 12 октября 2011

Единственное потенциальное преимущество заключается в том, что легче понять, что код правильно определяет каждую константу с одним отдельным набором битов.

Большинство людей в любом случае сразу увидят это, если вы просто напишите 1, 2, 4вместо 1<<0, 1<<1, 1<<2, поэтому, возможно, трудно увидеть это преимущество в этом примере.Как только вы доберетесь до 1<<15, некоторые люди пропустят опечатку, например, 32748.

2 голосов
/ 12 октября 2011

Использование (1<<x) в определении дает понять, что значение представляет собой один бит, а не число.

Для компилятора это не имеет значения, поскольку (1<<2) вычисляется во время компиляции, а не вво время выполнения.Четко показать, что они являются однобитными значениями, вместо этого полезно для любого, кто читает код, потому что, например, они могут быть несколькими значениями, которые могут быть объединены, или что одна переменная может использоваться для хранения нескольких флагов:

// Multiple options are combined with bitwise-or
show_message(DSF_CAPTION|DSF_ALERT, "Hey...");
...

// Checking is made using bitwise-and, not equality
if (status & DSF_RUNNING)
  ...

Кроме того, иногда требуется наличие определенных битов при работе с оборудованием (например, на определенном порту ввода / вывода может потребоваться указать пятый бит, потому что именно так аппаратное обеспечение подключено, и (1<<4) более читабельно, чем 16 длячто).

2 голосов
/ 12 октября 2011

Это битовые значения, например 1, 2, 4. 8.

Bit 0 = (1 << 0) = 1
Bit 1 = (1 << 1) = 2
Bit 2 = (1 << 2) = 4
Bit 3 = (1 << 3) = 8
...etc...

Это более удобный и надежный способ их определения, чем использование явных значений, особенно когда битовые индексы становятся больше (например, (1<<15) гораздо проще для понимания и более интуитивно понятен, чем 32768 или 0x8000, поскольку очевидно, означает «бит 15», а не какое-то произвольное число).

1 голос
/ 12 октября 2011

Это действительно для ясности - это показывает, что различные определения являются битовыми масками, которые обычно используются вместе для фильтрации значений из входных данных. Я не знаю, знаете ли вы, что такое битовая маска - вот ссылка: http://www.vipan.com/htdocs/bitwisehelp.html

0 голосов
/ 12 октября 2011

Иногда положение бит представляет некоторые битовые операции, как в вашем случае:

#define DSF_OVER        (1<<0)  is 1
#define DSF_DISPLAY     (1<<1)  is 2  
#define DSF_CALLFLOW    (1<<2)  is 4 (This is not 3)

Если вы добавите новый элемент позже, вы сделаете это как

#define DSF_OVER       1
#define DSF_DISPLAY    2  
#define DSF_CALLFLOW   4
#define DSF_CALLNEW    5.

Вы не можете иметь значение 5 здесь, так как оно включает два бита (101 в двоичном виде). Чтобы избежать таких потенциальных ошибок, всегда безопасно использовать макросы, используя >>. Он не может выдавать значение 5 (101) по ошибке, когда следующий бит должен быть 1000 в двоичном виде.

Все дело в удобстве программирования для создания безошибочного кода.

0 голосов
/ 12 октября 2011

Независимо от того, предпочитаете ли вы (1 << n) или нет, каждый должен знать, что означают шестнадцатеричные числа. Всякий раз, когда вы встречаете hex в исходном коде, это всегда означает, что некоторые битовые или байтовые манипуляции имеют место. Вы не используете шестнадцатеричное обозначение для каких-либо других целей. Поэтому целесообразно писать маски, литералы числовых битовых манипуляций и т. Д. В шестнадцатеричном виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...