Удаление приведений в стиле C в коде C ++ под Android - PullRequest
4 голосов
/ 25 июня 2011

Я видел этот пост на SO: Есть ли способ отключить старое приведение стилей c в c ++ , и был рад применить -Wold-style-cast к моему коду Android C ++. Я быстро столкнулся со следующими приведениями в stdio.h:

static __inline int __sputc(int _c, FILE *_p) {
    if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
        return (*_p->_p++ = _c);
    else
        return (__swbuf(_c, _p));
}

Файл stdio.h был включен в серию других включений, начиная с ostream. Должны ли заголовки библиотеки C ++ включать заголовки C, которые выполняют приведение в стиле C? Кто-нибудь пробовал отключать приведения в стиле C под Android NDK?

Ответы [ 2 ]

7 голосов
/ 25 июня 2011

Да, вполне допустимо, чтобы заголовок стандартной библиотеки C ++ включал заголовки C.

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#include <iostream>
#include <vector>
// etc.
#pragma GCC diagnostic pop

push и pop существуют для того, чтобы вы могли поддерживать состояние диагностики до и после #pragmas.

Конечно, вам нужно будет делать это везде, где вы включаете стандартные заголовки. Если у вас есть много мест, в которых они есть, то лучше «рефакторинг» ваших включений, чтобы все ваши заголовки включали один заголовок, который, в свою очередь, включает стандартные заголовки с оболочками diagnostic.

2 голосов
/ 25 июня 2011

Да, очевидно, что заголовки C ++ могут включать заголовки C. И стандарт не запрещает любому заголовку выполнять приведение в стиле C. Нет, я не пробовал эту функцию. Лично я избегаю использования приведения C-Style без помощи компилятора.

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