在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).
在n3092,这被弃用了:
附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).
在n3225中,这已被删除.
它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.
有谁知道为什么它被改变了?
我有一个C++程序,我用mingw编译(gcc for Windows).使用包含gcc 4.4.1的mingw的TDM版本.可执行文件链接到两个静态库(.a)文件:它们是用C编写的第三方库; 另一个是由我编写的C++库,它使用C库提供我自己的C++ API.
在我看来,(在我看来,过多)部分C库的功能是在内联函数中实现的.当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我会收到链接错误,说明所有内联函数都有多个定义 - 我都有在我的C++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何内容都在C库和C++库中为它创建了一个函数.
当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义.
编译器如何/为什么在两个库中为这些内联函数生成函数和符号?如何强制它停止在我的代码中生成它们?是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法?
(仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern"C"保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同.)
值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障似乎与我的代码有关,它应该从DLL调用自己的函数版本.(好像编译器正在创建我没有要求的本地版本的函数.)
之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案:
这个问题的答案是海报是多个定义变量,我的问题是内联函数的多重定义: 重复多重定义错误在多个cpps中包含相同的标题
这是一个MSVC计划,但我正在使用mingw; 另外,海报在这个问题中的问题是在标题中类主体之外定义C++类构造函数,而我的问题是内联的C函数: 静态Lib多重定义问题
这个傻瓜将他的所有C代码重命名为C++文件,他的C代码不是C++ - 安全:链接时 多个std :: functions的多个定义
这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为
在声明全局变量时,"static"和"const"之间有什么区别;
namespace General
{
public static class Globals
{
public const double GMinimum = 1e-1;
public const double GMaximum = 1e+1;
}
}
Run Code Online (Sandbox Code Playgroud)
哪一个更好(考虑到这些变量永远不会改变)
namespace General
{
public static class Globals
{
public static double GMinimum1 = 1e-1;
public static double GMaximum1 = 1e+1;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读C和C++中的一些源代码文件(主要是C)...我知道'static'关键字的含义是静态函数是只对同一文件中的其他函数可见的函数.在另一个上下文中,我读到了在我们不希望它们被编写到文件之外的情况下使用静态函数的好处...
我正在阅读一个源代码文件,如前所述,我看到所有函数(除了main)都是静态的......因为没有其他附加文件与主源代码.c文件(甚至是标题)链接,逻辑上为什么我应该在所有功能之前放置静态?当只有1个源文件时,它们应该受到什么保护?!
编辑:恕我直言我认为这些关键字只是为了使代码看起来更大更重..