LINUX.ORG.RU

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

 ,


0

1

а есть ли такая опция компиляции, что бы не нужно было делать объявления функций, которые позже по коду? Оно же касается и объявлений классов. Для gcc/MinGw/Qt?

Ответ на: комментарий от Harald

тебе трудно объявление сделать

Да.

anonymous
()

Я для таких целей делаю #include «srcname-private.h», который генерится небольшим скриптом, щас до десктопа доберусь, выложу.

anonymous
()
Ответ на: комментарий от Harald

Не «ибо стандарт нарушает». Для таких вещей есть -fpermissive. Я так думаю, в плюсах можно наворотить такой код, в котором результат компиляции оставшейся части файла будет зависеть от того, как распарсить вызов. Потому что в gcc (не g++), например, это всего лишь варнинг.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
$ cat ~/bin/mkproto 
#!/bin/sh

for file; do
    grep -B1 '^\w\+(' $file | grep -v '^--$' | paste -s -d' \n' - - | sed -e 's/)$/);/'
done

Правда для этого нужны объявления в конкретном indent-style:

result_t
my_function(arg_t arg...)
т.е. тип с квалификаторами на первой строке, а имя функции с аргументами полностью на второй. Для другого стиля и аргументов на нескольких строках можно придумать свой более сложный регэксп.

В виме можно вставлять динамически как :r !mkproto %

———

Еще можно делать извратным способом, который наверняка не оценят твои сослуживцы — завернуть весь сорец в холостую безымянную категорию Objective-C:

@interface NSObject ()
@end

@implementation

... // тут все форварды ресолвятся сами по себе

@end

Сорцы сохранять как source.m, конпелять как обычно — компилятор сам определит язык. Функции будут экспортированы точно так же, как обычные сишные, без манглинга и прочей фигни. Правда в объектнике могут появиться объективовские символы от безымянной категории, которые скорее всего будут выкинуты линкером по факту неиспользования (тут я не уверен, но даже если нет, то вреда никакого).

arturpub ★★
()

касается и объявлений классов

Такого нет, но тем же способом выдернуть /class \(\w\+\)/, и пропустить через sort/uniq, труда я думаю не составит.

arturpub ★★
()

use C#, Luke

anonymous
()
Ответ на: комментарий от intelfx

Для таких вещей есть -fpermissive

Что открывает дорогу для багов и потери совместимости с чем-то отличным от gcc

annulen ★★★★★
()
Ответ на: комментарий от annulen

Я не спорю с тем, что -fpermissive — это плохо.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Потому что в gcc (не g++), например, это всего лишь варнинг.

Это варнинг, но лучше бы был error, потому что если есть этот варнинг, то есть вероятность неочевидные проблемы получить. В основном проблемы связаны с неверной интерпретацией компилятором возвращаемого значения.

Sorcerer ★★★★★
()
Ответ на: комментарий от Harald

ибо стандарт нарушает

и что? а старые атрибуты gcc стандарт не нарушают?

next_time ★★★★★
()
Ответ на: комментарий от annulen

потери совместимости с чем-то отличным от gcc

ну да, а «опция компиляции, что бы не нужно было делать объявления функций, которые позже по коду?» обойдётся без потерь совместимости, не-не-не

next_time ★★★★★
()
Ответ на: комментарий от next_time

В сях нет шаблонов. Если ты про кресты, то не знаю точно, но objc++ это такая же тонкая надстройка, как и objc, и имхо оно должно быть совместимо с остальным c++ abi.

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.