1

ヘッダー ファイルで関数を宣言し、C++/C ファイルで関数を定義しました。関数が定義されている C++ ファイルには、関数が宣言されているヘッダー ファイルが含まれています。

その関数呼び出しが他の C++ で必要とされるときはいつでも、その C++ ファイルを含めるようになりました。これは悪い習慣ですか?.hまたは、ファイルのみ で関数を定義する必要がありますか?


関数.h

char *BoyerMoore_skip(char *string, int strLength);

BM.cpp:

#include "function.h"
char *BoyerMoore_skip(char *string, int strLength);
{
    ...
}

main.cpp:

    include "BM.cpp"
    int main()
{
---
BoyesMoore_skip()
}
4

5 に答える 5

3

それらを別々のヘッダーファイルで定義するのが通例ですが、必ずしも「悪い習慣」と見なされるわけではありません。

「 main メソッド」の前に ODR を定義すると、いくつかの ODR の問題が発生する可能性がありますが、私はそれを試してみます。好きなことをしてください。

于 2013-08-17T04:41:32.497 に答える
1

はい、そのヘッダーを複数の領域に含めるのは悪い習慣です。つまり、インクルードが行うことは次のとおりです。コンパイラが #include を検出すると、コンパイラはその領域にあるすべてのコードを取得し、その #include がある場所に挿入します。複数の cpp ファイルをまとめてコンパイルする場合、または同じファイルを #include するファイルを #include する場合。これにより、コードのチャンクが複数回挿入され、プログラムのサイズが不必要に増加します。もう 1 つの良い方法は、ヘッダー ファイルで #ifndef...#endif を大規模なプログラムに使用することです。次のようになります。

次のようにコード化された person.h ファイルがあるとします。

#ifndef PERSON_H_
#define PERSON_H_

#include <stdio.h>
#include <stdlib.h>

typedef char NAME[41];

typedef struct date {
    int month;
    int day;
    int year;
} DATE;

typedef struct person {
    NAME name;
    int age;
    float height;
    DATE bday;
} PERSON;
#endif

これは、コンパイルのプリプロセッサ段階で行われます。PERSON_H_ が定義されていない場合は、それを作成し、その PERSON_H_ トークンの下の #define と #endif の間のすべてを関連付けます。これで、プリプロセッサは #include "person.h" に遭遇するたびに、PERSON_H_ が既に存在するかどうかを確認します。存在する場合は、PERSON_H_ に関連付けられたコードを再度含めません。これにより、ヘッダー ファイルのインクルードなどによって関数を複数回定義することを防ぎます。

ヘッダー ファイルで関数を定義することをお勧めします。これらは関数プロトタイプと呼ばれます。それらは、期待する関数をコンパイラに伝えます。そして、プロトタイプはあなたがしたものとは少し異なります。変数名を宣言する必要はなく、宣言だけです。したがって、関数プロトタイプは次のようになります。

char *BoyerMoore_skip(char *, int );

それ以外の

char *BoyerMoore_skip(char *string, int strLength);
于 2013-08-17T06:22:56.263 に答える
1

通常、すべての関数宣言と #defines を別のヘッダー ファイルに入れ、それを .c または .cpp ファイルに含めるのが通例です。しかし、あなたがしていることは悪い習慣だとは思いません。

于 2013-08-17T04:41:07.310 に答える