如何强制编译器在 C/C++ 本身中声明函数?

How to force the compiler to declare functions in C/C++ itself?

本文关键字:声明 函数 C++ 编译器 何强制      更新时间:2023-10-16

问题:
如果我的电脑可以做得更快,我讨厌编写标头或声明我的函数。
事实就是如此。我
尝试做什么:我
试图在main函数之后声明一个foo函数。
但是编译器返回一个错误: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++ 代码,我接受更改编译器。
任何回应都将不胜感激。

这对于独立函数是不可能的,因为这些语言至少需要一个函数原型来调用它。话虽如此,在C++中,您可以使用类来实现类似的结果:

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

这是否是一种好的做法是另一回事。

您可以使用旧的 (K&R( C 编译器。在 K&R C 中,编译器将隐式假设任何未声明的函数都返回 int 并具有变量参数列表。

但是,该功能从未在C++中得到支持。 在现代 C 语言中也强烈不鼓励这样做(比 1990 年代初更新的任何语言(,并且在 1999 年的 C 标准中是不允许的。 原因是这样的功能为程序员错误提供了很多机会(例如,使用不正确类型的参数调用函数,和/或将返回值分配给不适当类型的变量,这两者都经常给出未定义或其他错误的行为(。

我相信你走错了路。

你的编译器没有"知道"你有一个函数声明,这只是故事的一半。如果只声明函数而不是使用它,然后定义它(可能在不同的转换单元中(,则编译器无法在优化期间内联代码。现代编译器可以使用链接时间优化,但必须在命令行上启用该功能。

因此,我建议您对代码重新排序,而不是使用(自动生成的(标头中的函数声明。只需将定义移到代码中的用法前面即可。

C++编写"仅头文件"代码有时很有用,在头文件和源文件中拆分软件并不总是最好的主意。这样做各有利弊,但使用具有完整实现的标头通常可以通过内联提供更好的优化。如前所述:也可以通过 LTO 进行。

顺便说一句:从实现生成头文件的任务已经在这里描述过:从头自动生成C++文件?

这与GCC无关,它是通用的C++。新标准引入了看起来有希望解决语言的"包含地狱"问题的模块,无论如何,这仍然不是你要找的。如果没有事先的声明,无论编译器如何,都无法执行所需的操作。