Code Fragment:这是纯粹的C?

时间:2012-12-13 11:51:38

标签: c compiler-construction strict

我有以下代码片段,我想知道它是纯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编译器会给我一个错误呢?

3 个答案:

答案 0 :(得分:8)

不,这不是有效的C.这一行:

    Function x[3+1];

缺少struct关键字,并且没有typedef struct Function Function;来介绍您似乎正在使用的类型别名。

此外,使用//注释需要最近足够的编译器,在C99之前,语法没有正式添加到C中。由于这个原因,较旧的编译器也会失败。

答案 1 :(得分:3)

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

也许尝试一个真正的编译器呢?如何获取代码并将其放入GCC以获得更好的错误消息。

尽管如此,听起来你收到错误消息:"missing ';' at可能只是意味着编译器的内容看起来应该是两个语句而你忘了用;分解它,它可能不是最好的错误消息,但没有编译器可以总是告诉你什么是错的,他们只是暗示,因为他们希望你变得更聪明。 :)

您的代码中有一堆struct

typedef struct Cerchio {
typedef struct Punto {
struct Function{

其中一个struct与其他typedef不同。

  • 如果您使用Cerchio,则可以仅使用名称typedef来引用结构(例如)。
  • 如果您不使用struct Function,则需要每次都明确调用它:{{1}}

答案 2 :(得分:1)

除了缺少struct个关键字,您的代码必须#include <stdio.h>。在C99中,这是一个格式良好的程序。在C89中,程序在没有它的情况下格式良好(一旦其他错误被修复),但是具有未定义的行为。

gcc -pedantic-errors -std=c99会为您提供包含错误的确切行号,此外还会提供一些您应该注意的警告。您的定义如:

typedef struct Punto { ... };
即使他们是合法的,也是错的。 typedef没有任何效果,因为您没有提供您应该定义的类型的名称。因此,在C中识别它的唯一方法是struct Punto,而不是Punto,因为它可以在C ++中识别。