Определение константы оценивает в C

Стандарт C ++ не имеет сетевых утилит, но вы можете использовать библиотеку boost::asio для загрузки содержимого веб-страницы и поиска строки "active".

Один из способов сделать это:

boost::asio::ip::tcp::iostream stream("www.example.com", "http");
stream << "GET /something/here HTTP/1.1\r\n";
stream << "Host: www.example.com\r\n";
stream << "Accept: */*\r\n";
stream << "Connection: close\r\n\r\n";
stream.flush();

std::ostringstream ss;
ss << stream.rdbuf();
std::string str{ ss.str() };

if (auto const n = str.find("active") != std::string::npos)
  std::cout << "found\n";
else
  std::cout << "nope\n";
5
задан Deduplicator 30 March 2015 в 15:07
поделиться

10 ответов

Правило, за которым я следую, состоит в том, чтобы только объявить вещи в файлах H и определить их в файлах C. Можно объявить и определить в единственном файле C, предположив, что он будет только использоваться в том файле.

Объявлением я имею в виду, уведомляют компилятор относительно его существования, но не выделяют место для него. Это включает #define, typedef, extern int x, и так далее.

Определения присваивают значения объявлениям и выделяют место для них, такой как int x и const int x. Это включает функциональные определения; включая их в заголовочных файлах часто приводят к потраченному впустую пространству кода.

Я видел, что слишком много младших программистов запутываются, когда они помещают const int x = 7; в заголовочном файле и затем задаются вопросом, почему они получают ошибку ссылки для x быть определенным несколько раз. Я думаю как минимум, Вам было бы нужно static const int x чтобы избежать этой проблемы.

Я не был бы слишком взволнован по поводу скорости кода. Основной вопрос с компьютерами (с точки зрения скорости и стоимости) давно смещенный от скорости выполнения до простоты разработки.

8
ответ дан 13 December 2019 в 05:43
поделиться

При необходимости в константах (реальные константы времени компиляции), можно сделать это три пути, поместив их в заголовочные файлы (нет ничего плохо с тем):

enum {
    FOO_SIZE = 1234,
    BAR_SIZE = 5678
};

#define FOO_SIZE 1234
#define BAR_SIZE 5678

static const int FOO_SIZE = 1234;
static const int BAR_SIZE = 5678;

В C++ я склонен использовать перечислимый путь, так как он может быть ограничен по объему в пространство имен. Для C я использую макрос. Это basicially сводится к вопросу вкуса все же. При необходимости в константах с плавающей точкой Вы не можете больше использовать перечисление. В C++ я использую последний путь, статическая константа дважды, в этом случае (примечание в статичном C++ было бы избыточно затем; они стали бы статичными автоматически, так как они - константа). В C я продолжал бы использовать макросы.

Это - миф, что использование третьего метода замедлит Вашу программу всегда. Я просто предпочитаю перечисление начиная со значений, которые Вы получаете, rvalues - Вы не можете получить их адрес, который я рассматриваю как добавленную безопасность. Кроме того, существует намного меньше шаблонного записанного кода. Глаз сконцентрирован на константах.

3
ответ дан 13 December 2019 в 05:43
поделиться

для autoconf среды: можно всегда определять константы в файле конфигурации также. AC_DEFINE () я предполагаю, макрос для определения через всю сборку.

0
ответ дан 13 December 2019 в 05:43
поделиться

У Вас действительно есть потребность волноваться о преимуществе встроенных? Если Вы не пишете встроенный код, придерживаетесь удобочитаемости. Если бы это - действительно магическое число чего-то, я использовал бы определение; я думаю, что константа лучше для вещей как строки версии константы и аргументы вызова функции изменения. Тем не менее определение в.c, объявите в правиле.h, определенно справедливо универсально принятая конвенция, и я не повредил бы его просто, потому что Вы могли бы сохранить поиск памяти.

1
ответ дан 13 December 2019 в 05:43
поделиться

Я хотел бы видеть больше контекста для Вашего вопроса. Тип значения очень важен, но Вы пропустили его. Значение ключевого слова константы в C является довольно тонким; например, символ константы *p; не означает, что указатель p является константой; можно записать p все, что Вы любите. То, что Вы не можете записать, является памятью, на которую указывает p, и это остается верным, как раз когда значение p изменяется. Это о единственном случае, который я действительно понимаю; в целом значение тонкого размещения константы ускользает от меня. Но этот особый случай чрезвычайно полезен для параметров функции, потому что он извлекает обещание из функции, что память, на которую указывает аргумент, не будет видоизменена.

Существует еще один особый случай, который все должны знать: целые числа. Почти всегда постоянные, именованные целые числа должны быть определены в.h файле как литералы перечисления. перечисление вводит не, только позволяют Вам связанным с группой константам вместе естественным способом, но также и позволяют Вам названия тех констант, которые будут замечены в отладчике, который является огромным преимуществом.

Я записал десятки тысяч строк C; вероятно, сотни, если я пытаюсь разыскать его. (туалет ~/src/c / *.c говорит, что 85 тысяч, но некоторые изо что сгенерированы, и конечно существует много кода C, скрывающегося в другом месте). Кроме этих двух случаев о, я никогда не находил много использования для константы. Я буду рад изучить новый, полезный пример.

0
ответ дан 13 December 2019 в 05:43
поделиться

Как правило Вы не определяете вещи как static в заголовке. Если Вы действительно определяете static переменные в заголовке, каждый файл, который использует заголовок, получают его собственную частную копию того, что объявляется static, который является антитезой принципа DRY: не повторяйте себя.

Так, необходимо использовать альтернативу. Для целых типов, с помощью перечисления (определенный в заголовке) очень мощно; это работает хорошо с отладчиками также (хотя лучшие отладчики могут помогать с #define макрос оценивает также). Для типов нецелого числа, extern объявление (дополнительно квалифицированный с const) в заголовке и единственном определении в одном файле C обычно лучший способ пойти.

1
ответ дан 13 December 2019 в 05:43
поделиться

Я могу дать Вам косвенный ответ. В C++ (в противоположность C) const подразумевает static. Thatis для высказывания в C++ static const то же самое как const. Таким образом, это говорит Вам как, который организация по стандартизации C++ чувствует о проблеме т.е. всех consts должен быть статичным.

0
ответ дан 13 December 2019 в 05:43
поделиться

Если Вы хотите встроить значение в своих функциях, необходимо использовать #define MY_MAGIC_NUMBER 0x12345678
Даже a static const unsigned MY_MAGIC_NUMBER = 0x12345678 вызовет выборку значения из адреса. Потеря производительности не будет действительно иметь значения если Вы значение много в циклах.
Я только использую const для аргументов функции.

Были некоторые комментарии и вниз голосуют об этом ответе, таким образом, я протестировал свое предположение и просмотрел сгенерированный блок, и этот ответ является неправильным. В основном #define и const даст тот же результат.

-1
ответ дан 13 December 2019 в 05:43
поделиться

В C++ необходимо всегда использовать

const int SOME_CONST = 17;

для констант и никогда

#define SOME_CONST 17

Определяет будет почти всегда возвращаться и кусать Вас позже. Consts находятся на языке и со строгим контролем типов, таким образом, Вы не станете странными ошибки из-за некоторого скрытого взаимодействия. Я поместил бы константу в соответствующий заголовочный файл. Пока это - #pragma однажды (или #ifndef x / #define x / #endif), Вы никогда не будете получать ошибок компиляции.

В ванили C, у Вас могли бы быть проблемы совместимости, где необходимо использовать #defines.

0
ответ дан 13 December 2019 в 05:43
поделиться

Ответить на сущность Вашего вопроса:
Вы обычно НЕ хотите определять статическую переменную в заголовочном файле.
Это заставило бы Вас копировать переменные в каждом единицы перевода (C файлы), которые включают заголовок.

переменные в заголовке должны действительно быть объявлены экстерном, так как это - подразумеваемая видимость. Посмотрите этот вопрос для хорошего объяснения.

На самом деле ситуация не могла бы быть столь страшной, как компилятор, вероятно, преобразует тип константы в литеральное значение. Но Вы не могли бы хотеть полагаться на то поведение, особенно если оптимизация выключена.

0
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: