0

次のコードフラグメントがあり、それが純粋なCなのか、それともいくつかのC++要素が含まれているのかを知りたいです。この質問は、Cだけだと思う​​という事実から生じていますが、一部のコンパイラはコードを受け入れません。

   // User struct derived from FunctionBlock
    struct Function{
        // Inputs
        int codeGenerationIterator;
        int i;
        char* s;
        // Outputs
        // Internal
    };
    void FunctionCall(struct Function *arg){
    }
    void FunctionConstructor(struct Function *arg){
        arg->i=3;
        arg->s="!";
        // Call constructor for all not primitive variables
        // Create struct with first call
        FunctionCall(arg);
    }
    // User type definition
    typedef struct Punto{
        int codeGenerationIterator;
        Function x[3+1];
            Function *x_pointer[3+1];
        double y;
    };
    void PuntoConstructor(struct Punto *arg){
        // Call constructor for all not primitive variables
        for(arg->codeGenerationIterator=0;arg->codeGenerationIterator<=3;arg->codeGenerationIterator++){
            arg->x_pointer[arg->codeGenerationIterator]=&(arg->x[arg->codeGenerationIterator]);
            FunctionConstructor(arg->x_pointer[arg->codeGenerationIterator]);
        }
    }
    // User type definition
    typedef struct Cerchio{
        int codeGenerationIterator;
        double r;
        Punto centro;
            Punto *centro_pointer;
    };
    void CerchioConstructor(struct Cerchio *arg){
        // Call constructor for all not primitive variables
            arg->centro_pointer=&(arg->centro);
        PuntoConstructor(arg->centro_pointer);
    }
    // User type definition
    typedef struct Container{
        int codeGenerationIterator;
        Cerchio circonferenza[10+1];
            Cerchio *circonferenza_pointer[10+1];
    };
    void ContainerConstructor(struct Container *arg){
        // Call constructor for all not primitive variables
        for(arg->codeGenerationIterator=0;arg->codeGenerationIterator<=10;arg->codeGenerationIterator++){
            arg->circonferenza_pointer[arg->codeGenerationIterator]=&(arg->circonferenza[arg->codeGenerationIterator]);
            CerchioConstructor(arg->circonferenza_pointer[arg->codeGenerationIterator]);
        }
    }

    int main(void){

        // Variable definitions
        int codeGenerationIterator;
        int count;
        Punto insiemePunti[50+1];
            Punto *insiemePunti_pointer[50+1];
        Cerchio cerchio;
            Cerchio *cerchio_pointer;
        Container container;
            Container *container_pointer;
        Container containers[11+1];
            Container *containers_pointer[11+1];
        // Call constructor for all not primitive variables
        for(codeGenerationIterator=0;codeGenerationIterator<=50;codeGenerationIterator++){
            insiemePunti_pointer[codeGenerationIterator]=&insiemePunti[codeGenerationIterator];
            PuntoConstructor(insiemePunti_pointer[codeGenerationIterator]);
        }
            cerchio_pointer=&cerchio;
        CerchioConstructor(cerchio_pointer);
            container_pointer=&container;
        ContainerConstructor(container_pointer);
        for(codeGenerationIterator=0;codeGenerationIterator<=11;codeGenerationIterator++){
            containers_pointer[codeGenerationIterator]=&containers[codeGenerationIterator];
            ContainerConstructor(containers_pointer[codeGenerationIterator]);
        }

        container.circonferenza[1].centro.x[0].i=2;
        containers[2].circonferenza[2].centro.x[4].i=2;

    printf("Works!");
    getchar();getchar(); // TODO: delete
    return 0;
    }

ご覧のとおり、クラスやオーバーロードは使用していませんが、単純な命令、構造体、およびいくつかのポインターのみを使用しています。では、なぜ一部の厳密なCコンパイラーでエラーが発生するのでしょうか。

4

3 に答える 3

8

いいえ、これは無効ですC.この行:

    Function x[3+1];

キーワードstructがなく、typedef struct Function Function;使用していると思われるタイプエイリアスを紹介することはできません。

また、//コメントを使用するには、最近十分なコンパイラが必要です。その構文は、C99まで正式にCに追加されていませんでした。古いコンパイラもこの理由で失敗します。

于 2012-12-13T11:53:41.127 に答える
3

Some example of compilers are: "Miracle C", "Tiny C" and the error does not provide any information

たぶん、実際のコンパイラを試してみてください。コードを取得してGCCにスローするだけで、より適切なエラーメッセージを取得できます。

その事実にもかかわらず、エラーメッセージが表示されているようです。"missing ';' atおそらく、コンパイラにとっては2つのステートメントであるはずのように見え、それをで分割するのを忘れたということです。これは最良のエラーメッセージで;はないかもしれませんが、コンパイラはありません。何が悪いのかをいつでもはっきりと伝えることができます。彼らはあなたがより賢くなることを期待しているので、それらは単なるヒントです。:)

コードにたくさんのstructsがあります:

typedef struct Cerchio {
typedef struct Punto {
struct Function{

これらstructの1つは他のようではありません。

  • を使用するtypedefと、名前だけで構造を参照できますCerchio(たとえば)。
  • 使用しない場合はtypedef、毎回明示的に呼び出す必要があります。struct Function
于 2012-12-13T12:33:17.327 に答える
1

欠落しているstructキーワードに加えて、コードはである必要があり#include <stdio.h>ます。C99では、これは整形式のプログラムであるために必要です。C89では、プログラムはそれなしで整形式ですが(他のエラーが修正されると)、未定義の動作をします。

gcc -pedantic-errors -std=c99エラーを含む正確な行番号が表示され、さらに注意が必要な警告が表示されます。あなたの定義は次のようになります:

typedef struct Punto { ... };

彼らは合法であるにもかかわらず、すべて間違っています。定義typedefしていると思われるタイプの名前を指定しないため、は効果がありません。したがって、Cでそれを識別する唯一の方法は、あなたが望むようにではstruct Puntoなく、C++で識別できるようにすることです。Punto

于 2012-12-13T12:57:14.860 に答える