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;

2行を交換すると機能します。

于 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

変数のアクセスと可用性については、他の人がすでに回答していますが、一般的に、そのような種類のインターフェースには正当な理由が必要だと思います。オブジェクトへのアクセスを最適化するコンパイラの可能性を減らします。

C で受け入れられないのは、次の宣言です。

int getValue();

C ではプロトタイプではありません。不特定の数の引数を受け取る可能性がある関数を宣言しています。代わりに、次を使用します。

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

私はこれが以前にCで行われているのを見たことがありますが、1.スレッドセーフになりたくない(実際にはそれが必要です)、グローバル変数を静的にし、それをヘッダファイル。とはいえ、グローバル変数を使用することは悪い習慣であり、可能であれば避けるべきです。

于 2012-09-15T10:14:16.377 に答える