Q
C++函数原型
4
A
回答
11
void和extern void版本相同。它们表明函数具有外部链接(即函数的定义可能来自其他C或C++文件)。 Static表示该函数具有内部链接,并且仅存在于当前C++文件中。
您几乎从来没有看到这些说明符适用于函数,因为99.9%的时间需要默认的extern
行为。
您可能会在全局变量上看到static
或extern
存储说明符,这通常是为了减少与同一项目中其他文件的名称冲突。这是C的延期;如果你使用C++,这种事情应该使用匿名命名空间而不是static
来完成。
3
前两个是一样的东西。第三个给出f
内部链接,这意味着一个不同的源文件可能使用名称f
是不同的。
不应使用static
与第三个示例中的一样。相反,使用匿名命名空间:
namespace { // anonymous
void f(int n);
}
4
这比C++的一个C语言问题,而是:
void f(int n);
声明一个函数f接受单个整型参数。
extern void f(int n);
声明一个函数f,该函数只接受一个整数参数,但存在于其他文件中。编译器会相信你已经在某处实现了该函数。如果链接程序找不到它,您将收到链接程序错误。
static void f(int n);
声明一个函数f,它取单个整数参数。静态关键字使这个有趣。如果这是在.cpp文件中,该功能只对该文件可见。如果它在.h文件中,那么包含该头文件的每个.cpp文件都将创建该函数的副本,该副本只能由该实现文件访问。
0
到目前为止,这两个答案都不赞成使用静态函数。为什么?是什么让
命名空间{
void f(int n);
}
优于
静态无效F(INT N);
?这并不简单,它不容易理解......
0
匿名命名空间是一个更通用和更干净的解决方案,你可以有它的功能,变量,类。并且static
在一些情况下意味着内部链接,在其他静态生命周期中过度负载。
尽管匿名命名空间有一个缺点。由于外部链接,对象/库文件的导出部分将随着所有那些长期不会存在的名字而膨胀,这些名称不会是静态的。
相关问题
- 1. C函数原型
- 2. C++函数原型?
- 3. 函数原型在C
- 4. C++内联函数原型
- 5. c或C++中main()函数的原型?
- 6. 函数原型
- 7. 了解C中的函数原型
- 8. C函数原型,编译错误
- 9. 函数原型变量作用域C++
- 10. 调用C函数没有原型
- 11. 从C++中的原型调用函数
- 12. 编写一个原型函数(C++)
- 13. C函数原型和.set指令
- 14. 如何正确地原型C函数
- 15. ctags多行C函数原型
- 16. JavaScript原型函数
- 17. “......” 在函数原型
- 18. perl函数原型
- 19. 在父函数原型中使用原型的Javascript函数
- 20. Javascript - 原型函数数组
- 21. 参数函数原型
- 22. 函数原型错误,非void函数
- 23. 原型函数中的Javascript子函数
- 24. JavaScript *不是函数(原型函数)
- 25. 替代函数语法/函数原型?
- 26. 从原型函数调用函数
- 27. 函数原型在主函数中?
- 28. Javascript构造函数原型
- 29. 函数原型错误
- 30. 非原型函数声明
轻微nitpick:第一个不*必然*表示外部链接。它可以简单地作为函数定义的前向声明,稍后将出现在同一个翻译单元中。 – 2010-12-06 19:23:18
@Charles:如果函数存在于同一个实现文件中,那么它将被同一文件导出供其他文件使用,在这种情况下,它仍然具有外部链接。 (虽然你认为这个函数本身不需要来自另一个翻译单元) – 2010-12-06 19:24:56