如何强制编译器在 C/C++ 本身中声明函数?
How to force the compiler to declare functions in C/C++ itself?
问题:
如果我的计算机可以更快地完成,我讨厌编写 headers 或声明我的函数。
确实如此。
我尝试做的事情:
我试图在 main
函数之后声明一个函数 foo
。
但是编译returns报错:
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++ 代码,我同意更改编译器。
任何回复将不胜感激。
这与 GCC 无关,它是 C++ 通用的。新标准引入的模块看起来有望解决该语言的 'include hell' 问题,但无论如何这仍然不是您要找的东西。没有事先声明,无论编译器如何,都无法做你想做的事。
这对于独立函数是不可能的,因为语言至少需要一个函数原型来调用它。话虽如此,在 C++ 中,您可以使用 类 来获得类似的结果:
class Main {
public:
static int main() {
foo();
return 0;
}
static void foo() { }
};
int main() {
return Main::main();
}
这是否是一个好的做法是另一回事。
您可以使用旧的 (K&R) C 编译器。在 K&R C 中,编译器将隐式假定使用 returns int 且具有可变参数列表的任何未声明函数。
但是,C++ 从未支持该功能。它在现代 C(比 1990 年代早期更新的任何东西)中也是强烈反对的,并且在 1999 年的 C 标准中是不允许的。原因是这样的特性为程序员提供了很多错误的机会(例如,使用不正确的参数调用函数类型,and/or 将 return 值分配给类型不当的变量,这两种情况通常会导致未定义或其他错误行为)。
我相信你走错了路。
您的编译器没有 "know" 您有函数声明只是故事的一半。如果您只声明函数而不是使用它然后定义它,可能在不同的翻译单元中,编译器无法在优化期间内联您的代码。现代编译器可以使用 link 时间优化,但必须在命令行上启用该功能。
所以我建议您重新排序您的代码,而不是使用来自(自动生成的)headers 的函数声明。只需将您的定义移至代码中用法的前面即可。
在 C++ 中,有时编写 "header only" 代码并将您的软件拆分为 header 和源文件并不总是最好的主意。这样做有利也有弊,但是使用 headers 和完整的实现通常可以通过内联提供更好的优化。如前所述:也可以通过 LTO。
顺便说一句:这里已经描述了从实现中生成 header 文件的任务:Automatically generate C++ file from header?
问题:
如果我的计算机可以更快地完成,我讨厌编写 headers 或声明我的函数。
确实如此。
我尝试做的事情:
我试图在 main
函数之后声明一个函数 foo
。
但是编译returns报错:
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++ 代码,我同意更改编译器。
任何回复将不胜感激。
这与 GCC 无关,它是 C++ 通用的。新标准引入的模块看起来有望解决该语言的 'include hell' 问题,但无论如何这仍然不是您要找的东西。没有事先声明,无论编译器如何,都无法做你想做的事。
这对于独立函数是不可能的,因为语言至少需要一个函数原型来调用它。话虽如此,在 C++ 中,您可以使用 类 来获得类似的结果:
class Main {
public:
static int main() {
foo();
return 0;
}
static void foo() { }
};
int main() {
return Main::main();
}
这是否是一个好的做法是另一回事。
您可以使用旧的 (K&R) C 编译器。在 K&R C 中,编译器将隐式假定使用 returns int 且具有可变参数列表的任何未声明函数。
但是,C++ 从未支持该功能。它在现代 C(比 1990 年代早期更新的任何东西)中也是强烈反对的,并且在 1999 年的 C 标准中是不允许的。原因是这样的特性为程序员提供了很多错误的机会(例如,使用不正确的参数调用函数类型,and/or 将 return 值分配给类型不当的变量,这两种情况通常会导致未定义或其他错误行为)。
我相信你走错了路。
您的编译器没有 "know" 您有函数声明只是故事的一半。如果您只声明函数而不是使用它然后定义它,可能在不同的翻译单元中,编译器无法在优化期间内联您的代码。现代编译器可以使用 link 时间优化,但必须在命令行上启用该功能。
所以我建议您重新排序您的代码,而不是使用来自(自动生成的)headers 的函数声明。只需将您的定义移至代码中用法的前面即可。
在 C++ 中,有时编写 "header only" 代码并将您的软件拆分为 header 和源文件并不总是最好的主意。这样做有利也有弊,但是使用 headers 和完整的实现通常可以通过内联提供更好的优化。如前所述:也可以通过 LTO。
顺便说一句:这里已经描述了从实现中生成 header 文件的任务:Automatically generate C++ file from header?