Возврат перечисления от функции в C?

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

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

Чтобы улучшить производительность на стороне сервера, вы можете кэшировать закодированную версию; Вы можете записать $ b64largeImage на диск в том же каталоге, проверить, существует ли он, и отправить его клиенту.

Чтобы сократить время передачи, убедитесь, что на сервере включен GZIP; это должно сжать ваши данные.

Тем не менее, производительность на стороне клиента останется проблемой - ваши изображения, скорее всего, не будут кэшироваться на клиенте, а декодирование изображений (особенно если их 40 на каждой странице) может потреблять приличное количество ресурсов ЦП (особенно на мобильных устройствах). устройства).

Затем возникает проблема, заключающаяся в том, что если браузер может декодировать изображение, а аттаксер / скребок - тоже, и они могут сохранить копию этого изображения. Таким образом, все эти усилия не на самом деле приносят вам большую секретность.

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

В этом случае вы можете сосредоточиться на том, чтобы URL-адреса трудно / невозможно угадать или срок их действия истек. Это повредит вашему SEO, так что это компромисс. S3 имеет URL-адреса с истекшим сроком действия, или вы можете создать службу, которая проверяет реферер для каждого запроса и обрабатывает только запросы изображений из доменов, занесенных в белый список, или создать собственную службу URL-адресов с истекающим сроком действия - но в каждом случае вы будете использовать JPEG / GIF / PNG изображения, так что вы получите небольшой размер файла и ограниченное время декодирования.

27
задан Jonathan Leffler 28 May 2015 в 07:22
поделиться

4 ответа

В C ++ вы можете использовать только Foo .

В C вы должны использовать перечислять Foo , пока вы не предоставите typedef для него.

А затем, когда вы ссылаетесь на BAR , вы используете не Foo.BAR , а просто BAR . Все константы перечисления совместно используют одно и то же пространство имен (пространство имен «обычные идентификаторы», используемое функциями, переменными и т. Д.).

Следовательно (для C):

enum Foo { BAR, BAZ };

enum Foo testFunc(void)
{
    return BAR;
}

Или с типом typedef :

typedef enum Foo { BAR, BAZ } Foo;

Foo testFunc(void)
{
    return BAR;
}
47
ответ дан Jonathan Leffler 28 November 2019 в 04:59
поделиться
enum Foo
{
   BAR,
   BAZ
};

В C тип возвращаемого значения должен иметь enum перед ним. А когда вы используете индивидуальные значения перечисления, вы никоим образом их не квалифицируете.

enum Foo testFunc()
{
    enum Foo temp = BAR;
    temp = BAZ;
    return temp;
}
2
ответ дан Brian R. Bondy 28 November 2019 в 04:59
поделиться

Я считаю, что отдельные значения в перечислении сами по себе являются идентификаторами, просто используйте :

enum Foo testFunc(){
  return BAR;
}
4
ответ дан dmckee 28 November 2019 в 04:59
поделиться

Я думаю, что некоторые компиляторы могут потребовать

typedef enum tagFoo
{
  BAR,
  BAZ,
} Foo;
2
ответ дан kenny 28 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

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