Как заставить компилятор объявлять функции в самом C / C ++? - PullRequest
5 голосов
/ 12 октября 2019

Проблема:
Я ненавижу писать заголовки или объявлять свои функции, если мой компьютер может делать это быстрее.
И это так.
То, что я пыталсяdo:
Я пытался объявить функцию foo после функции main.
Но компилятор возвращает ошибку:
error: ‘foo’ was not declared in this scope
Код:

#include <iostream>

//no function declaration is allowed, please.
//no other header is allowed, please.

void main() {
    foo();
}

void foo() {
    std::cout << "The compiler is smart now!" << std::endl;
}

Я согласен изменить компилятор, если gcc / g ++ не может скомпилировать этот код c ++.
Любой ответ будет очень благодарен.

Ответы [ 4 ]

4 голосов
/ 12 октября 2019

Это невозможно с автономными функциями, поскольку языки требуют как минимум прототип функции для его вызова. Сказав это, в C ++ вы можете использовать классы для достижения аналогичного результата:

class Main {
public:
    static int main() {
        foo();
        return 0;
    }
    static void foo() { }
};

int main() {
    return Main::main();
}

Является ли это хорошей практикой, это другое обсуждение.

2 голосов
/ 12 октября 2019

Вы можете использовать старый (K & R) C-компилятор. В K & R C компилятор неявно ПРИНИМАЕТ любую необъявленную функцию, которая используется, возвращает int и имеет список переменных-переменных.

Однако эта функция никогда не поддерживалась в C ++. Это также настоятельно не рекомендуется в современном C (что-либо более новое, чем в начале 1990-х годов) и запрещено в стандартах C с 1999 года. Причина в том, что такая функция предоставляет множество возможностей для ошибок программиста (например, вызов функции с аргументами неверноговведите и / или присвойте возвращаемое значение переменной неподходящего типа, которая часто дает неопределенное или иное ошибочное поведение).

1 голос
/ 12 октября 2019

Я считаю, что вы на неправильном пути.

То, что ваш компилятор не "знал", что у вас есть объявление функции, - это только половина истории. Если вы объявляете функцию, а не используете ее, а затем определяете ее, возможно, в другом модуле перевода, компилятор не сможет встроить ваш код во время оптимизации. Современные компиляторы могут использовать оптимизацию времени ссылки, но эта функция должна быть включена в командной строке.

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

В C ++ иногда полезно писать код «только для заголовков», и разделение вашего программного обеспечения на заголовок и исходный файл не всегда является лучшей идеей. Для этого есть свои плюсы и минусы, но использование заголовков с полной реализацией часто предлагает лучшую оптимизацию путем встраивания. Как сказано: Также возможно через LTO.

Кстати: задача генерации файлов заголовков из реализации уже описана здесь: Автоматически генерировать файл C ++ из заголовков?

0 голосов
/ 12 октября 2019

Это не связано с GCC, оно универсально с C ++. В новом стандарте представлены модули, которые выглядят многообещающе для решения проблем языка «включи ад», но это все равно не совсем то, что ты ищешь в любом случае. Невозможно сделать то, что вы хотите, независимо от компилятора, без предварительного объявления.

...