Библиотека других #define конфликт имен

Принятый ответ относится к статье в Википедии при обсуждении действительной локальной части адреса электронной почты, но Википедия не является авторитетом в этом.

IETF RFC 3696 является авторитетом по этому вопросу, и с ним следует ознакомиться в разделе 3. Ограничения для адресов электронной почты на странице 5:

Современные адреса электронной почты состоят из «локальной части», отделенной от «доменной части» (полного доменного имени) знаком at-sign ( "@"). Синтаксис доменной части соответствует синтаксису в предыдущем разделе. Проблемы, выявленные в этом разделе в отношении фильтрации и списков имен, относятся также к доменным именам, используемым в контексте электронной почты. Имя домена также может быть заменено IP-адресом в квадратных скобках, но эта форма настоятельно не рекомендуется, за исключением случаев тестирования и устранения неполадок.

Локальная часть может появляться с использованием соглашений о цитировании, описанных ниже. Указанные формы редко используются на практике, но необходимы для некоторых законных целей. Следовательно, они не должны быть отклонены в процедурах фильтрации, но вместо этого должны быть переданы в систему электронной почты для оценки хостом назначения.

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

  Abc\@def@example.com

является действительной формой адреса электронной почты. Также могут появляться пробелы, как в

  Fred\ Bloggs@example.com

Символ обратной косой черты может также использоваться для цитирования, например,

  Joe.\\Blow@example.com

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

  "Abc@def"@example.com

  "Fred Bloggs"@example.com

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

Без кавычек локальные части могут состоять из любой комбинации
алфавитных символов, цифр или любого из специальных символов

  ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

точка (".") Также может появляться , но не может использоваться для начала или окончания локальной части, а также не могут появляться два или более последовательных периода. Иными словами, любой символ ASCII (печатный), отличный от знака-символа ("@"), обратной косой черты, двойной кавычки, запятой или квадратных скобок, может отображаться без кавычек. Если появляется какой-либо из этого списка исключенных символов, они должны быть заключены в кавычки. Такие формы, как

  user+mailbox@example.com

  customer/department=shipping@example.com

  $A12345@example.com

  !def!xyz%abc@example.com

  _somename@example.com

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

Как и другие, я отправляю регулярное выражение для PHP и JavaScript для проверки адресов электронной почты:

/^[a-z0-9!'#$%&*+\/=?^_`{|}~-]+(?:\.[a-z0-9!'#$%&*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-zA-Z]{2,}$/i

6
задан Zoomulator 3 July 2009 в 19:52
поделиться

4 ответа

У вас есть несколько вариантов, и все они отстой.

  • Добавьте #undef DrawText в свой собственный код
  • Не включать окна .h . Если другая библиотека включает его за вас, не включайте его напрямую. Вместо этого включите его в отдельный файл .cpp, который затем может отображать ваши собственные функции-оболочки в своем заголовке.
  • Переименуйте свой собственный DrawText .

По возможности я обычно выбираю средний вариант . windows.h ведет себя плохо по множеству других причин (например, он фактически не компилируется, если вы не активируете проприетарные расширения C ++ от Microsoft), поэтому я просто избегаю его как чумы. Он не попадает в мои файлы, если я могу ему помочь. Вместо этого я пишу отдельный файл .cpp, чтобы содержать его и предоставлять необходимые мне функции.

Кроме того, не стесняйтесь присылать это как ошибку и / или отзыв на connect.microsoft.com. Windows.h - это преступно плохо спроектированный заголовок, и если люди обратят на него внимание Microsoft, есть (небольшая) вероятность, что однажды они его исправят.

Хорошая новость в том, что windows.h это только заголовок , который ведет себя так плохо. Другие заголовки обычно пытаются добавить к макросу префикс некоторого имени, зависящего от библиотеки, чтобы избежать конфликтов имен, они стараются избегать создания макросов для общих имен и стараются избегать использования большего количества макросов, чем необходимо.

h - это только заголовок , который ведет себя так плохо. Другие заголовки обычно пытаются добавить к макросу префикс некоторого имени, зависящего от библиотеки, чтобы избежать конфликтов имен, они стараются избегать создания макросов для общих имен и стараются избегать использования большего количества макросов, чем необходимо.

h - это только заголовок , который ведет себя так плохо. Другие заголовки обычно пытаются добавить к макросу префикс некоторого имени, зависящего от библиотеки, чтобы избежать конфликтов имен, они стараются избегать создания макросов для общих имен и стараются избегать использования большего количества макросов, чем необходимо.

10
ответ дан 8 December 2019 в 12:22
поделиться

Это нежелательный побочный эффект #include ing . Предполагая, что вы на самом деле не используете Windows ' DrawText () где-либо в своей программе, совершенно безопасно #undef сразу после:

// wherever you #include <windows.h>, or any other windows header
#include <windows.h>
#undef DrawText
5
ответ дан 8 December 2019 в 12:22
поделиться

Не существует общего способа избежать этой проблемы - как только вы # включаете файл заголовка с помощью препроцессора, он может переопределить любое имя, которое ему нравится, и вы ничего не можете с этим поделать. Вы можете #undef имя, но это предполагает, что вы знаете, что имя было # определено изначально.

4
ответ дан 8 December 2019 в 12:22
поделиться

Просто #undef символы, которые вам не нужны. Но убедитесь, что вы включили windows.h , и сделайте это перед включением SDL:

#include <windows.h>
#undef DrawText

#include <SDL/SDL_opengl.h>
0
ответ дан 8 December 2019 в 12:22
поделиться
Другие вопросы по тегам:

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