cyphen156

비주얼 스튜디오의 C99 일부 지원에 대한 생각 본문

잡생각 정리글

비주얼 스튜디오의 C99 일부 지원에 대한 생각

cyphen156 2023. 7. 4. 11:27

오늘 비주얼 스튜디오로 C언어 알고리즘 공부를 하다가

잘 해결이 안되서 구글링을 해봤는데 

대부분의 사람들이 배열의 길이를 변수를 통해 선언하고 있엇다.

 

그런데 내가 알기로 C언어에서는 malloc함수를 사용하지 않고는 배열길이의 가변선언이 불가능할텐데? 라는 의문이 떠올랐고, 이에 대해 찾아본 결과 C99 표준에서는 VLA(Variable Length Array/)이라는 동적 배열 선언이라는 기능을 지원한다는 것이다. 그럼에도 불구하고 비주얼 스튜디오에서는 이 기능이 사용되지 않았다. 


이것은 비주얼 스튜디오가 C99표준을 완전히 따르는 것이 아닌 일부 사용하는것이기 때문이었다. 

 

내가 이 알고리즘을 해결하는데 표준 입출력 라이브러리(stdio.h)를 제외한 모든 라이브러리를 사용하지 않고 문제를 해결하기로 다짐했기 때문에 malloc을 사용할 수 없고,

비주얼 스튜디오 내에서 제한사항을 따라서 상수값을 통한 배열길이를 선언하면 만약 이차원 배열의 곱셈을 처리하는 중에 N과 M (Array1[N][M], Array2[M][N])이 서로 다른 경우 발생할 수 있는 문제를 조건문을 통해 처리해야한다는 번거로움이 발생한다.

대안은 GCC컴파일러를 설치하여 이것을 IDE에 사용하도록 하는것인데 만약 이방법을 쓰면 비주얼스튜디오에서 제공하는 통합 디버거의 기능을 사용하지 못하게 될 가능성이 있다는 것이다.

 

음...일단 GCC로 컴파일 한 뒤에 실행파일로 실행시켜봐야겟다.

 

아래는 내가 이 생각을 하게된 코드(이차원 배열의 덧셈)와 GPT와 나눴던 대화다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {
    int N, M;
    scanf("%d %d", &N, &M);
    
    int A[N][M];
    int B[N][M];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            scanf("%d", &A[i][j]);
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            scanf("%d", &B[i][j]);
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("%d ", A[i][j] + B[i][j]);
        }
        printf("\n");
    }
    return 0;
}

ME : C언어에서 배열을 동적으로 생성하려면 라이브러리를써야 하잖아 그런데 그거 없이 할수있어? 변수를 입력받아 이걸 배열생성에 써먹고 싶은데

 

GPT : C에서 동적으로 배열을 생성하려면 일반적으로는 라이브러리(stdlib.h의 malloc, calloc, realloc 등)를 사용합니다. 그러나 라이브러리를 사용하지 않고 동적으로 배열을 생성하는 것은 표준 C에서 지원되지 않습니다.
그러나, C99 표준에서는 동적 배열(VLA, Variable Length Array)을 지원하며, 이를 사용하면 사용자 입력에 따라 배열 크기를 변경할 수 있습니다. 다만, VLA는 스택에 메모리를 할당하고, 일반적으로 스택 공간이 힙 공간보다 크기가 작기 때문에 큰 배열을 다루는 데에는 불안정할 수 있습니다.
이러한 방법은 몇 가지 주의점이 있습니다. 먼저, VLA는 C99 표준에서만 지원되며, 일부 컴파일러에서는 지원되지 않을 수 있습니다. 또한, 동적 메모리 할당을 사용하는 것에 비해 메모리 공간을 더 효율적으로 관리하기 어렵다는 단점이 있습니다. 스택 오버플로우의 위험성도 있습니다. 때문에 가능하면 동적 메모리 할당을 이용한 방법을 추천드립니다.

 

ME : 비주얼 스튜디오는 그럼 C99표준이랑 좀 다르다는거네

 

Visual Studio의 C 컴파일러는 C99 표준의 일부를 지원하지만, 완전히 C99 표준을 준수하는 것은 아닙니다. 그래서 C99에서 추가된 몇 가지 기능들, 특히 Variable Length Arrays(VLAs)는 Visual Studio에서 지원하지 않습니다.

하지만, Visual Studio는 Microsoft의 C++ 컴파일러를 기반으로 하기 때문에, C++의 많은 기능들을 지원합니다. 따라서, C++ 코드를 작성하고 컴파일하는 데는 Visual Studio가 매우 유용합니다.

최신의 C 표준을 완전히 지원하는 컴파일러가 필요한 경우, GCC(GNU Compiler Collection)나 Clang과 같은 컴파일러를 고려해 보실 수 있습니다. 이들 컴파일러는 C11, C18 등의 최신 C 표준을 지원합니다.

또한, 최신 C 표준의 일부 기능을 사용하려면, 특정 컴파일 플래그를 설정해야 할 수도 있습니다. 예를 들어, GCC에서 C99 표준을 사용하려면 -std=c99 플래그를 사용하면 됩니다.


ME : 그럼 비주얼 스튜디오에서 GCC쓰는건?

 

GPT : 비주얼 스튜디오에서도 GCC를 사용하는 것은 가능합니다. 그러나 이를 위해서는 GCC를 설치하고 비주얼 스튜디오에서 사용하도록 설정해야 합니다.
GCC를 비주얼 스튜디오에서 사용하려면 다음과 같은 과정을 거칠 수 있습니다:

  1. 먼저, MinGW를 설치합니다. MinGW는 Windows 용 GCC 컴파일러를 포함하고 있습니다. MinGW를 다운로드하고 설치하는 방법은 다양하며, 인터넷에서 찾을 수 있습니다.
  2. MinGW가 설치된 후에는 환경 변수를 설정하여 컴파일러를 사용할 수 있도록 합니다. 시스템 환경 변수의 Path에 MinGW가 설치된 디렉토리의 bin 폴더를 추가해야 합니다. 이 폴더에는 gcc.exe 같은 컴파일러 실행 파일이 있습니다.
  3. 비주얼 스튜디오에서 GCC를 사용하려면, 적절한 빌드 도구를 설정해야 합니다. "프로젝트 속성"에서 "C/C++" 섹션을 찾아 "일반" 탭으로 이동합니다. "플랫폼 도구 집합"을 "GCC"로 변경합니다.
  4. 변경사항을 저장하고, 비주얼 스튜디오에서 프로젝트를 빌드합니다. 이제 비주얼 스튜디오는 GCC를 사용하여 C 코드를 컴파일합니다.
    위 과정은 비주얼 스튜디오에서 GCC를 사용하는 일반적인 방법입니다. 하지만 비주얼 스튜디오의 버전이나 설정에 따라서는 다르게 적용해야 할 수도 있습니다. 필요한 경우, 인터넷에서 자세한 가이드를 찾아보십시오.

ME : 그럼 GCC를썻을때 차이점은 뭐야

GPT : GCC를 사용하면 몇 가지 장점과 차이점이 있습니다:

  1. C99 표준 지원: GCC는 C99 표준을 지원하므로, 비주얼 스튜디오에서는 지원되지 않는 일부 기능들을 사용할 수 있습니다. 예를 들어, 가변 길이 배열(VLA)을 사용할 수 있습니다.
  2. 플랫폼 독립적: GCC는 다양한 운영 체제와 아키텍처에서 동작하도록 설계되었습니다. 따라서, 여러 플랫폼에서 동일한 코드를 컴파일하고 실행할 수 있습니다.
  3. 오픈 소스: GCC는 GNU 프로젝트의 일부로, 소스 코드가 공개되어 있습니다. 이는 누구나 GCC를 필요에 맞게 수정하거나 개선할 수 있다는 것을 의미합니다.
  4. 다양한 최적화 옵션: GCC는 다양한 최적화 옵션을 제공합니다. 이를 통해 코드의 실행 시간을 줄이거나 메모리 사용량을 줄일 수 있습니다.
    그러나 GCC를 사용하려면 별도로 설치하고 설정해야 한다는 단점이 있습니다. 또한, 비주얼 스튜디오의 통합 디버거와 같은 일부 기능을 사용할 수 없을 수도 있습니다. 이는 개발 환경에 따라 다르므로, 어떤 컴파일러를 사용할지 결정할 때 고려해야 합니다.

※ 추신
GPT는 완벽하지 않으므로 항상 교차검증을 해야됩니다.
꼭 참고용으로만 쓰세요. 블로그 글처럼