PS/자주 하는 답변

컴파일 에러는 "컴파일 에러"라고 쓰인 곳을 클릭하면 에러 메시지를 볼 수 있습니다.

djm03178 2023. 1. 2. 12:36

제곧내

 

는 아니고, 빌드하는 환경(컴파일러 종류 및 버전, 언어 버전 등)에 따라 허용하는 문법 / 확장 기능 / 라이브러리의 종속성 등이 다르기 때문에 직접 컴파일 했을 때 문제가 없었더라도 제출하면 컴파일 에러를 받게 될 수 있습니다. 이 경우 BOJ에서는 채점 현황에 나타난 "컴파일 에러" 문구를 클릭하면 자세한 에러 메시지를 보여줍니다.

 

여기에 걸린 링크를 클릭하면
이렇게 자세한 메시지가 나옵니다. 친절하게 cstring을 include하라고 제안까지 해주네요.

채점 환경에 따라 달라질 수 있다고는 했으나, 대개의 경우는 자신의 코드가 표준을 지키지 않고 특정 컴파일러에서는 제공하는 확장 기능이나 확장 라이브러리를 사용했거나, 헤더 파일이 내부적으로 종속성을 가져서 운 좋게 컴파일이 된 경우입니다. 예를 들어 일부 환경 (Visual Studio 2017)에서는 아래와 같은 코드가 컴파일이 될 수도 있으나,

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string s = "abc";
	cout << strlen(s.c_str()) << '\n';
}

원칙적으로 strlen은 cstring 또는 string.h (그냥 string이 아니라) 헤더를 포함해야 사용할 수 있는 함수이기 때문에 BOJ (C++17)에서는 컴파일 에러를 받게 됩니다.

 

다른 원인으로는 너무 큰 정적 배열을 선언한 것 등이 있습니다. 이런 경우 그만큼의 메모리를 할당받는 명령 자체를 만들어내지 못하기 때문에 실행 파일을 만들 수조차 없어 컴파일 에러를 받게 됩니다.

 

g++의 경우 표준을 잘 지키는 편에 속하므로, 로컬에서 잘 컴파일 됐던 C++ 코드가 BOJ에서 컴파일 에러를 받았다면 어딘가 표준을 지키지 않은 부분, 또는 문법적으로 적절하지 않은 부분이 있었겠거니 생각하고 문제점을 찾는 편이 좋습니다. 에러 메시지를 보고도 왜 그게 에러인지 모르겠다면, 레퍼런스를 보고 올바른 사용법을 알고 있는지 찾아보는 것이 좋습니다.