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

8cdiaqws  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(119)

我想将一些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函数转换为私有成员函数有什么影响?
前一种方法和后一种方法之间的优缺点(关于编译、链接、运行时)是什么?我没有在函数内部使用参数,以使示例简短(如果不使用它,我在其他问题中读到它可能应该转到匿名名称空间)。

//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(){}
bbuxkriu

bbuxkriu1#

在C++中,将全局静态C函数转换为私有成员函数有什么影响?
这样做的影响是,您已经将模块的(私有的,内部的)实现细节作为(公共的)接口的一部分。
前一种方法和后一种方法之间的优缺点(关于编译、链接、运行时)是什么?
缺点:

  • 你在你的界面中加入了语义噪音

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

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

即,如果你想改变helper,现在更新公共头,并导致广泛的重新编译文件,不应该受到影响
优点:

  • 没有。

在C++中,将实现文件本地细节(如helper)添加到匿名名称空间中是惯用的。

相关问题