11

我认为将它们声明为静态是最佳实践,因为它使它们在模块之外不可见。

您对此有何看法?

4

12 回答 12

26

对于 C++,比静态更好的方法是将其放在未命名(匿名)的命名空间中。这是防止全局命名空间污染的首选方法。

namespace {
void myLocalFunction() {
// stuff
}
}
于 2008-11-24T16:15:43.750 回答
9

如果它确实是一个仅在该 .c 文件内部的函数,那么是的。它应该有助于避免污染全局命名空间。另外,我认为如果函数是静态的,编译器可以对调用约定进行一些优化,因为它不知道其他源文件需要知道如何调用它。这仅适用于 c,因为正如其他人所指出的,c++ 有命名空间来解决这个问题。

于 2008-11-24T16:11:30.887 回答
2

在 C++ 中,您应该使用匿名命名空间,如下所示:

// foo.cpp
namespace
{
   class Core { ... };
   void InternalFandango(Core *);
}

void SomeGloballyVisibleFunction()
{
   InternalFandango(&core);
}

优点:这也适用于结构/类声明。
在 C 中,只需将函数标记为“静态”。在 C++ 中也没有反对使用“静态”,但我学会了更喜欢命名空间,因为它是一个适用于所有声明的单一概念。

于 2008-11-24T16:19:23.400 回答
2

有很多关于实现细节的内容,而不是太多关于概念的内容。

限制变量/函数等的范围确实是一个好习惯。这是面向对象设计的基本概念——您希望将私有作为私有。这样你的界面更干净,代码维护更容易。而且您不会发现有一天更改您认为是私有的破坏编译的东西,因为项目的另一部分中的某个人喜欢您的功能并决定使用它。

于 2008-11-24T18:49:14.953 回答
2

在 C 语言中,我在文件范围内将所有内容(函数和变量)设为静态,直到我可以证明它们在文件之外是必需的。如果只有那个函数会使用它们并且它们不是太大,我会在一个函数中使它们成为静态的。基本上,如果声明大于函数的其余部分,我可以将声明放在函数之外。当然,还有一个源文件提供的公共服务的标题。

于 2008-11-25T02:11:38.353 回答
2

同意。因此,静态函数的原型必须放在 .c 文件的顶部,而不是 .h 文件中。

于 2008-12-19T23:44:49.587 回答
1

我认为 C 和 C++ 有不同的约束static:在 C 中你没有命名空间,而 .c 文件是你的模块,因此将所有非公共函数设为静态以防止错误非常重要!

于 2008-11-24T16:18:23.790 回答
1

关于在 C++ 中使用“静态”(匿名命名空间不提供),我能想到的唯一可能有用的属性是 GCC 中有一个警告,您可以打开未使用的静态函数(一种死代码形式) . 对于匿名命名空间中未使用的函数,您不会得到它,因此,如果您希望编译器在您停止使用该函数时告诉您这种不太可能发生的情况,请这样做。

于 2008-11-24T18:23:02.107 回答
1

在 C 代码中,默认情况下将函数设为静态。只为其他模块需要的函数创建非静态函数和 .h 声明。

在 C++ 代码中,将文件本地的那些函数放入匿名命名空间使其成为静态的。至少在 GNU 编译器中,这将产生最好和最小的代码,因为如果所有使用都内联,则不会编写任何函数。如果您打算将其内联,那么将其标记为内联当然比静态更好。

我不知道为什么 g++ 将匿名名称空间中的未调用函数体写入输出,但确实如此。隐藏可见性的功能似乎也出现了;标记为隐藏符号,但仍会在目标文件中产生未使用的代码块。GCC 可能不明白在这些情况下不需要代码。或者我错过了一些东西,总是可能的。

于 2008-11-25T02:25:29.853 回答
0

如果您使用 GCC,那么您应该查看可见性标志(请参阅http://gcc.gnu.org/wiki/Visibility以获得完整的讨论)。

它将完全隐藏符号,而不是将它们标记为不可访问。这减少了符号表,并有助于减少链接时间。

不仅如此,它还为更多内联打开了大门,如果这就是你所追求的。

于 2008-11-26T17:31:02.100 回答
-1

如果“模块”只是指 CPP 文件,则可以将声明和定义直接放在 CPP 文件中。

于 2008-11-24T16:04:12.277 回答
-1

在 C++ 中,您可以像这样声明函数私有:

class MyClass
{                           
public:                 
void publiclyAccessibleFunction();            
private:                
    void onlyAccesibleFromWithinTheClass();
int some_member_parameter;          
};

注意onlyAccesibleFromWithinTheClass()功能。

于 2008-12-09T15:27:46.587 回答