ограничить ошибку компиляции квалификатора - PullRequest
5 голосов
/ 31 октября 2011

Я использую Code :: Blocks 10.05 и mingw.Похоже, что компилятор не распознал ограничение ограничителя и возвращает «error: Ожидается»; «,» или «)» перед «src».Нужно ли передавать какой-либо параметр компилятора, чтобы правильно его скомпилировать?

int inet_pton4 (const char *restrict src, unsigned char *restrict dst)

p / s: кажется, mingw не поддерживает inet_pton4, поэтому я попытался интегрировать версию с открытым исходным кодом в мой код.

Ответы [ 2 ]

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

Если ваш компилятор не поддерживает ключевое слово restrict, просто удалите это ключевое слово (a) .

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

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

Если вы укажете компиляторам, что не поддерживает это ключевое слово, недостатком будет ноль (так как они все равно не поддерживают эту оптимизацию), а повышение будет значительным, как в "это будет скомпилировать для вас ": -)


(a) Возможно, вы захотите сначала убедиться, что вы компилируете в режиме C99. Хотя может быть правдой, если вы используете более старый gcc, который не понимает restrict, также возможно, что вы не компилируете в режиме C99, например, с -std=c99 ( gcc документы, похоже, указывают, что restrict поддерживается даже до версии 3.0).

Если по какой-то причине вы не можете активировать режим C99, я думаю, что gcc имеет расширение, позволяющее использовать __restrict.

3 голосов
/ 31 октября 2011

Поскольку restrict является новым в C99, и поскольку, как указывает @paxdiablo, пропуск ключевого слова restrict на самом деле ничего не ранит, вы можете сделать это:

#if __STDC_VERSION__ < 199901L
#define restrict /* nothing */
#endif

Поместите этов заголовке, который #include d для всего в вашем проекте (или, по крайней мере, для всех, кто использует restrict).

Это должно позволить вашему коду компилироваться с любым компилятором C, поддерживает ли он C99 или нет.Он должен даже работать для компилятора, который не определяет __STDC_VERSION__.

Но , так как вы используете MinGW, который использует gcc, использование gcc --std=c99 также должно решить проблему(как отмечает @paxdiablo).

Вы можете безопасно сделать и то, и другое.(И решение #if, вероятно, будет полезно для других.)

...