我应该将 C 静态函数转换为未命名命名空间中的私有成员函数还是自由函数?

Should I convert C static function to private member function or free function in unnamed namespace?

我想将一些 C 遗留代码更新为 C++。假设我在 C:

中有类似于此代码的内容
//my_struct.h
typedef struct myStruct {
//some members go here
} myStruct;

int f1(myStruct*);
void f2(myStruct*);
//my_struct.c
#include "my_struct.h"

static int helper(myStruct* st)
{
   return 21;
}

int f1(myStruct* st)
{
   return helper(st);
}

void f2(myStruct* st) {}

如果我在 CPP 中将其更新为以下内容:

//myStruct.h
struct myStruct {
   int f1();
   void f2();
private:
   int helper();
};
//myStruct.cpp
int myStruct::f1(){
   return helper();
}

void myStruct::f2(){}

int myStruct::helper(){
   return 21;
}

在C++中将全局静态C函数转换为私有成员函数有什么影响?

前一种方法和后一种方法之间的pros/cons(关于编译、链接、运行时)是什么?我没有在函数内部使用参数来缩短示例(如果没有使用我在其他问题中读到它可能应该转到匿名命名空间)。

//myStruct.h
struct myStruct {
   int f1();
   void f2();
}
//myStruct.cpp
namespace{
   int helper(myStruct *st){
      return 21;
   }
}
int myStruct::f1(){
   return helper(this);
}

void myStruct::f2(){}

What is the impact of converting the global static C function to a private member function in C++?

影响是您已经为 (public) 接口的模块部分创建了一个(私有的、内部的)实现细节。

What would be the pros/cons (regarding compilation, linking, runtime) between the previous approach and the following one?

缺点:

  • 您在界面中添加了语义噪声

    也就是说,有更多内容供客户阅读和思考,即使这不应该影响他们,

  • 对内部实现细节的更改可能需要接口的所有客户端重新编译,而不仅仅是re-linking

    也就是说,如果您想更改 helper,现在会更新 public header 并导致不应该受到影响的文件的广泛重新编译

优点:

  • 有none.

在 C++ 中,向匿名命名空间添加 implementation-file-local 等详细信息(例如 helper)是惯用的做法。