将函数原型放在main或其他函数中是否合法?
Is it legal to put function prototypes inside of main or another function?
在c++语言中,将函数原型放在main
或其他函数中是否合法?这种做法不好吗?为什么有人把原型放在main里面?
显然最好将原型放在它们自己的页眉中;在任何函数之外:)
尽管如此,这是合法的:
#include <stdio.h>
int
main (int argc, char *argv[])
{
void foo ();
foo ();
return 0;
}
void foo ()
{
printf ("Foo!n");
}
是的,这是合法的——这是毫无疑问的。但这通常是不可取的。
不可取的一个原因是该函数只在该特定函数中可用(作为该声明的结果);同一文件中的其他函数不能使用该声明(但其他函数可能包含它们自己的函数声明-但这样您就重复了自己,这不是一个好主意)。
另外,你失去了交叉检查的主要好处。最好的方法是:
- 如果函数是在同一个源文件中定义的(并且没有在源文件之外使用),那么将其作用域限制为文件(
static
或匿名名称空间,或在适当的其他名称空间中),并确保在使用它之前定义或声明它。 - 如果函数是在不同的源文件中定义的,应该有一个声明函数的头文件。在定义函数的文件(确保头文件中的声明与定义一致)和使用该函数的文件中都包含头文件。
const
限定符,或从按值传递更改为按引用传递),您可能不需要更改源代码中的任何内容;简单的重新编译可能就足够了。
相关文章:
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关