Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Как убрать ворнинг gcc на pragma once?  (Прочитано 5309 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн bodro

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
    • Персональный сайт Бодро
Как убрать ворнинг gcc на pragma once?
« : 26 Ноября 2012, 16:14:54 »
Добрый день!

У меня есть такой код:

common.h
#pragma once
// Далее код

main.cpp
#include "common.h"
// Далее код

Опции сборки: -Wall -Wextra -Wcpp, т.е. отображение предупреждений включено помаксимуму.
Компилятор gcc ругается так: common.h:14: предупреждение: #pragma once in main file [enabled by default]

Это единственный ворнинг. Вообще, ничего ведь ужасного в том, что я использую once в главном файле нет, однако компилятор ругается. Я перерыл весь ман, но ничего толкового не нашёл (возможно, что я просто пропутил по невнимательности). Смотрел в исходниках gcc. Потратил час, но ничего не нашёл. Времени крайне мало - проект надо заканчивать, а вот что с ворнингом делать ума не приложу. В окончательном релизе будет использоваться -Werror, так что ворнинг победить надо.

Если кто знает, подскажите как. Притом, я хочу включить практически все ворнинги, кроме тех, в которых я уверен, например, в deprecated - их я тоже отключаю. А вот как отключить вот этот ворнинг? Кто-то подскажет?

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

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #1 : 26 Ноября 2012, 16:30:35 »
Да вроде никак, дело в том, что #pragma once не просто obsolete, она еще и компиляторо-специфична, потому и не рекомендуется. Кроме того, gcc уже давно include guard обрабатывает так же, как и #pragma once, так что выигрыша по скорости компиляции тоже не будет.

Оффлайн bodro

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
    • Персональный сайт Бодро
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #2 : 26 Ноября 2012, 16:38:25 »
Да с gcc про скорость понятное дело. Фишка в том, что типа кроссплатформенное и кросскомпиляторное должно всё быть. С другими потом разбираться буду - сейчас мне хотя б ворнинг заглушить. А ты уверен что никак? Тогда мне удалить прагму надо - вариантов других нет?

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #3 : 26 Ноября 2012, 17:12:39 »
А разве include guard не кроссплатформенен?
http://ru.wikipedia.org/wiki/Include_guard

Оффлайн bodro

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
    • Персональный сайт Бодро
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #4 : 26 Ноября 2012, 17:25:51 »
Да причём тут инклуд гуард? Как же он может быть не кроссплатформенен и не кросскомпиляторнен? Конечно! Вот только на некоторых компиляторах использование pragma once положительно влияет на скорости компиляции. Я использую инклуд гуард вместе с прагмой уанс. К тому же могут возникнуть другие проблемы с гуардом (хотя это вообще гипотетическая ситуация). Проект и так собирается порядка 20 минут. Вопрос не по оптимизации скорости, а по ворнингу.

В общем, как ворнинг-то у gcc убрать этот?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #5 : 27 Ноября 2012, 08:12:17 »
Ну как минимум надо #pragma once выкинуть.
Да, gcc её поддерживает, но все знают что это чисто из-за таких упрямых программистов как ты, без обид.

Скорость компиляции можно увеличивать другими средствами. Можно уменьшать связность модулей внутри приложения и использовать forward declaration.
Это так же требует вменяемого проектирования. Даёт неплохой результат.

Если сильно напрягает, настрой build-сервер.

Оффлайн bodro

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
    • Персональный сайт Бодро
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #6 : 27 Ноября 2012, 15:13:45 »
Странно. Вроде написал всё.  :-\
Цитировать
Вопрос не по оптимизации скорости, а по ворнингу.

В общем, как ворнинг-то у gcc убрать этот?

Вариант с убиранием #pragma once считается крайне нежелательным.
Может всё-таки кто-то знает?



Цитировать
Если сильно напрягает, настрой build-сервер.
Это не вариант вообще ибо ворнинг не уберёт. В своём вопросе я имел ввиду опцию компилеру или прагму.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #7 : 29 Ноября 2012, 08:28:43 »
http://www.cprogramming.com/reference/preprocessor/pragma.html
http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

Блин, у меня походу руки кривые, я не смог получить предупреждения по прагме

main.h
Код: (CPP) [Выделить]
/**
 * main.h
 */

#pragma once

#include <stdlib.h>
#define RETURN_CODE EXIT_SUCCESS

main.cpp
Код: (CPP) [Выделить]
#include <stdio.h>

#include "main.h"

int main()
{
    printf("Hello, world!\n");
    return RETURN_CODE;
}

g++ -Wall -Wextra -Wcpp main.cpp -o test
yurik@yurik-pc:~/test_pragma$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая
коммерческую ценность и применимость для каких-либо целей.

Как получить предупреждение?

Пользователь решил продолжить мысль 29 Ноября 2012, 08:38:48:
Вот есть руководство как давить вообще любые возмущения компилятора
http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html
Главное не перестараться. 99% предупреждений это ошибки которые еще аукнутся.
« Последнее редактирование: 29 Ноября 2012, 08:38:48 от Yurror »

Оффлайн bodro

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
    • Персональный сайт Бодро
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #8 : 06 Декабря 2012, 23:12:04 »
Спасибо за ваш ответ и ваше внимание. Ваш ответ натолкнул меня на мысль и я понял откуда берётся ошибка. Она возникает не в процессе инклудов, а при компиляции хедеров. Так же данную проблему можно воспроизвести и другим способом. Приведу оба варианта:

Прекомпилированные хедеры:
#pragma once
int f(void);
Вставка непосредственно в cpp-файл:
#pragma once
int main(int argc, char** argv) { (void) argc; (void) argv; return 0; }

Скрипт сборки:
rm -f main.o common.ghc
g++ -x c++-header -c common.h -o common.ghc
g++ -c main.cpp

В обоих вариантах появляется предупреждение:
$ ./build.sh
common.h:1:9: предупреждение: #pragma once в главном файле [по умолчанию включена]
main.cpp:1:9: предупреждение: #pragma once в главном файле [по умолчанию включена]
$

Т.е. ошибка связана не с инклудами, а с тем, что common.h прекомпилируется и содержит в себе once. Как исправить - есть идеи?

Ссылок-то вы накидали много, они даже полезные и интересные, только не имеют отношения к топику :)
Я ж написал что не хочу давить ворнинги и что понимаю как их выключать аргументами компилятора и прагмами, только вот не знаю как отключить конкретный ворнинг. Кстати, первая ссылка вообще про MSVC :) Но всё равно спасибо!


Как вариант, можно убрать прагму из common.h, но в дальнейшем я буду прекомпилировать все хедер-файлы. Есть идеи?

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Как убрать ворнинг gcc на pragma once?
« Ответ #9 : 08 Декабря 2012, 02:04:52 »
А зачем тебе прагма в прекомпилируемом хедере, они же по умолчанию один раз вставляются автоматически. вот он и ругается типа, ты че идиот, итак один раз только вставляем.

Пользователь решил продолжить мысль 08 Декабря 2012, 02:05:37:
Если уж совсем хочется ну сделай по старинке
#ifndef ...
#define ...





#endif

 

Страница сгенерирована за 0.017 секунд. Запросов: 21.