0

我已经开始使用 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;
}
4

5 回答 5

6

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

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

int my_private_value;

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

static int my_private_value;

所以,如果你想听起来像个专业人士,每当你想说出“全局变量”时,深吸一口气,说出带有文件范围和外部链接的对象这个词。这会让你在所有 C 面试中大放异彩:-)

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

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

当您交换两条线时,它确实有效。

于 2012-09-15T10:33:06.970 回答
3

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

static int my_private_value;

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

于 2012-09-15T10:17:30.943 回答
2

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

于 2012-09-15T10:17:14.863 回答
1

For the access and availability of the variable, others have already answered, but generally I'd say that you'd have to have good reasons for such a kind of interface. It does reduce the potential of the compiler to optimize the access to the object.

What is not acceptable in C is this declaration:

int getValue();

which in C isn't a prototype. It declares a function that may receive an unspecified number of arguments. Instead, use:

int getValue(void);
于 2012-09-15T10:42:17.013 回答
0

我之前已经看到这是在 C 中完成的,直到你 1. 不想成为线程安全的(实际上你确实想要)并使全局变量静态而不通过 a 公开它之前没有任何问题头文件。也就是说,使用全局变量是不好的做法,应该尽可能避免。

于 2012-09-15T10:14:16.377 回答