【问题标题】:declare variables in c as global or encapsulate them and use getter and setter [closed]将c中的变量声明为全局变量或封装它们并使用getter和setter [关闭]
【发布时间】:2012-09-08 07:45:33
【问题描述】:

我已经开始使用 C 进行编程,总的来说,我正在寻找“最佳实践”来构建我的代码。

之前主要使用面向对象的语言,我开始从这些语言中借鉴一些实践。

我的具体问题是:这段代码是否被认为是“可接受的”C 代码,或者我是否遇到了人们试图在 C 中使用封装的常见陷阱?

// A.h 
void setValue(int);
int getValue();

// A.c 
#include "A.h"

int my_private_value;

void setValue(int v)
{   
  my_private_value = v;
}   

int getValue(void)
{   
  return my_private_value;
}

【问题讨论】:

    标签: c scope encapsulation linkage


    【解决方案1】:

    学究式:C 中没有全局变量。变量具有范围、存储持续时间和链接。对于这些都不存在“全球”资格。

    那么,到底发生了什么?你的

    int my_private_value;
    

    是一个具有文件范围外部链接(以及静态存储持续时间)的变量。这种类型的链接意味着它可以被任何其他在范围内具有extern int my_private_value 声明的文件引用。为避免这种情况,变量必须具有内部链接。要声明具有内部链接的变量,请使用 static 关键字:

    static int my_private_value;
    

    因此,如果您想听起来像专业人士,每当您想说出“全局变量”时,请深呼吸并说出 具有文件范围和外部链接的对象。这会让你在所有 C 类面试中大放异彩:-)

    如果有人质疑您对缺乏“全局”变量的看法,您甚至可以向他们证明这一点。全局变量无处不在,对吧?但是在 C 中,对象的范围直到它的声明才开始。由于缺少真正的全局变量,因此无法像 in 一样转发引用变量

     int *foo = &bar;   /* Doesn't work in C: bar is not (yet) in scope. */
     int bar = 42;
    

    当你交换两行时它确实工作。

    【讨论】:

      【解决方案2】:

      我对您的代码所做的唯一更改是如何定义 my_private_value。我将其定义为:

      static int my_private_value;
      

      这可以防止外部代码模块声明extern int my_private_value;,然后直接访问它。

      【讨论】:

        【解决方案3】:

        这没关系,但你需要使变量static 使其具有内部链接;现在的方式,其他文件中的代码将能够直接访问它。有关链接及其如何影响变量可访问性的更多信息,请参阅this,或处理相同问题的this question

        【讨论】:

          【解决方案4】:

          对于变量的访问和可用性,其他人已经回答了,但通常我会说你必须有充分的理由才能使用这种接口。它确实降低了编译器优化对对象的访问的潜力。

          C 中不可接受的是这个声明:

          int getValue();
          

          在 C 中不是原型。它声明了一个可以接收未指定数量的参数的函数。相反,使用:

          int getValue(void);
          

          【讨论】:

          • 好点;我已经为 OP 更正了它(可能被 C++ 宠坏了 :-)
          • @Jens,嘿,不,这让我的回答几乎一文不值:(
          【解决方案5】:

          我之前已经在 C 中看到过这种情况,在您 1. 不想成为线程安全(事实上,您确实想要)并制作之前,它没有任何问题全局变量 static 并且不通过头文件公开它。也就是说,使用全局变量是不好的做法,应该尽可能避免。

          【讨论】:

          • translation: '这没有什么问题,除了我要列出的所有这些东西,它们都是非常错误的。' ...好吧。
          猜你喜欢
          • 2011-11-25
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          • 1970-01-01
          • 2012-08-27
          • 2014-06-07
          • 2018-04-04
          • 1970-01-01
          相关资源
          最近更新 更多