왜`&`는 C에서는 허용되지 않지만이 경우 C ++에서는 허용됩니까? 어떤 변론이 있습니까? [복제]

Nov 30 2020

다음은 내 C 코드입니다. void InitList(List &L);그러나 Code :: Blocks의 빌드 로그에 오류가 있습니다.

'&'토큰 앞에 ';', ','또는 ')'가 필요합니다.

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List &L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};

/*----------------------------------*/

void InitList(List &L)
{
    (&L)->data = malloc(sizeof(ElementType)*MaxSize); 
    (&L)->CurLength = 0;
}


int main()
{
    List L;
    InitList(&L);
    return 0;
}

하지만 C ++에서 시도했지만 오류가 없습니다.

#include <iostream>
using namespace std;
#define InitSize 100
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List &L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};


/*----------------------------------*/

void InitList(List &L)
{
    L.data = new ElementType[InitSize]; //L.data = malloc(...)
    L.CurLength = 0;
}

int main()
{
    List L;
    InitList(L);
    return 0;
}

답변

2 Monstarules Dec 01 2020 at 02:09

C의 함수 선언에서는 전달할 수 없습니다. 해당 데이터에 대한 포인터를 참조하려면 *를 사용해야합니다.

void InitList(List *L)
{
    L->data = malloc(sizeof(ElementType)*MaxSize); 
    L->CurLength = 0;
}

그리고

List *L;
InitList (&L);
1 RemyLebeau Dec 01 2020 at 02:22

에서는 void InitList(List &L);, L통과되는 기준 . C는 참조, 즉 C ++ 기능을 지원하지 않습니다. C에서는 L대신 포인터 로 전달해야합니다 (를 사용할 때 정확히 main()수행하려는 작업 List L; InitList(&L);이지만 선언 InitList()이 잘못되었습니다). 예 :

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElementType;

struct SeqList;
typedef struct SeqList List;
void InitList(List *L);
void CleanupList(List *L);

struct SeqList
{
    ElementType *data;
    int CurLength;
};

/*----------------------------------*/

void InitList(List *L)
{
    L->data = malloc(sizeof(ElementType)*MaxSize); 
    L->CurLength = 0;
}

void CleanupList(List *L)
{
    free(L->data); 
    L->CurLength = 0;
}

int main()
{
    List L;
    InitList(&L);
    ...
    CleanupList(&L);
    return 0;
}