OO C公共和私有功能的典型命名约定是什么?[关闭]


12

简短问题
有一种典型的方式来命名OO C项目的“公共”和“私人”成员吗?

背景
我完全理解公共和私营成员没有真正在C语言中存在。但是,像大多数C程序员一样,我仍然将成员视为公共或私有成员,以维护OO设计。除了典型的面向对象的方法,我发现我的自我下面,让我更容易分辨哪些方法的模式(见下面的例子),意味着对外界VS私有成员可能有更少的检查/更有效等...是否存在针对此类问题的标准或最佳实践,或者下面的示例是解决此问题的好方法?

标题示例

#ifndef _MODULE_X_H_
#define _MODULE_X_H_

bool MOD_X_get_variable_x(void);
void MOD_X_set_variable_x(bool);

#endif /* _MODULE_X_H_ */

范例来源

// Module Identifier: MOD_X 
#include "module_x.h"

// Private prototypes
static void mod_x_do_something_cool(void);
static void mod_x_do_something_else_cool(void);

// Private Variables
static bool var_x;

// Public Functions - Note the upper case module identifier
bool MOD_X_get_variable_x(void)      {return var_x;}
void MOD_X_set_variable_x(bool input){var_x = input;}

// Private Functions  - Note the lower case module identifier
void mod_x_do_something_cool(void){
     // Some incredibly cool sub routine 
}

void mod_x_do_something_else_cool(void){
     // Another incredibly cool sub routine 
}

2
+1有趣的话题:用C实现的OO设计!我将按照您的方法在头文件中声明公共函数,在.c文件中将私有函数声明为静态函数。我不确定为什么您需要特定的命名约定。为什么不对公共和私有功能同时使用例如大写字母?
乔治

13
Bjarne Stroustrup汇集了一种非常全面的方式来编写面向对象的C ...-
Ant

对于用C语言进行基于对象的编程的另一种有趣方式,您可以看一下X11程序员熟悉的Xt图形工具包。参考:en.wikipedia.org/wiki/X_Toolkit_Intrinsics
SDG

@ Giorgio:公共成员和私有成员的大小写要点是,以便在查看代码或维护代码时,一目了然地知道它是公共代码还是私有代码,而无需搜索声明。
亚当·刘易斯,

@蚂蚁:Objective-C是另一种可能性。我认为这里的要点是,如果您使用C进行编程,您仍然可以使用OO设计。当然,如果我大量使用OOP,我会选择OO语言。
乔治

Answers:


17

我使用的约定是:

  • 公共功能(在头文件中):

    struct Classname;
    Classname_functionname(struct Classname * me, other args...);
    
  • 私有功能(在实现文件中为静态)

    static functionname(struct Classname * me, other args...)

不要专注于案例。关键是要通过在前缀前添加前缀(在此约定中为类名称),从而将两个类的两个公共方法区分开。

而且,使OO-C产生的原因是对象作为第一个参数传递的方式。


1
+1不是C方面的大专家,但是看起来很扎实和正确(即使在封装方面,直到现在我都从未与C相关联)。
Yam Marcovic

提防某些编译器强制执行的标识符字符限制(例如,某些字符为31个字符!)
有意思,2012年

8

通常,惯例是根本不将私有函数放在头文件中

由于通常将一个对象的实现完全放在一个源中,因此私有函数通常只能是文件静态的。在这种情况下,您通常会跳过前缀以保存一些键入内容(该符号在该编译单元外部不可见)。

如果由于某种原因需要使该函数可用于其他某个类,但仍然可以私有,则可以像其他任何方法一样命名该函数,但将其放在单独的“ -private”标头中。

类型的定义也是如此。如果可能的话,仅在标头中将结构向前声明为不完整类型,然后在源或“ -private”标头中对其进行定义。您需要定义来继承该类,因此您将多余的标头视为受保护的,而不是私有的。


C语言中最大的面向对象代码片段可能是Gnome平台。您可以最轻松地在GObject库上看到约定,该约定提供了最低级别的基类。它大致是我上面所描述的,并在整个Gnome中使用。


很高兴您触及到该符号在编译单元外部不可见的事实。在与一些同事讨论了这个话题之后,我突然意识到。但是,为了澄清私有函数不在头文件中,它们在C文件中静态声明。
亚当·刘易斯,

-1

如果存在一个实际的“类”,以struct,opaque类型或类似形式出现,那么我将根据以下内容对其进行命名:

typedef struct classname_t classname_t; 

_t后缀是C中非常常见的命名约定,由C标准本身使用。较不常见的是对类/类型使用大写字母。

接下来要做的是为所有公共功能提供一个命名前缀。通常一些3个字母的东西。属于“苹果类”的所有功能都可能命名为app_set_something()app_get_something()等等。

然后,您将要使用一致的命名约定。在“构造”可以被命名app_init()或者app_construct(),在“析构函数app_clear()app_destruct()app_destroy()或类似。使用所有的类相同的命名约定,然后做二传手/ getter函数相同,等等。

私有(静态)函数实际上并不需要类前缀,因为无论如何都无法在.c文件外部访问它们。出于一致性原因,您仍可以为它们指定相同的前缀,或者可能只是使用专用前缀(例如)来命名它们private_func()。一种非常常见的方法是给它们起一个下划线名称,但这很不好,因为它可能与库函数冲突。严格来说,您不能使用以下划线开头的标识符。

我不建议使用大写字母来区分私人和公共。几乎所有C编码标准中的约定都是大写字母表示常量,宏或预处理器定义。C标准本身,Windows API,Linux内核等都使用该约定。


_t被保留。
莉莉丝·里弗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.