개발
-
간과할 수 있는 문자열 비교 실수개발/C·C++ 2019. 10. 1. 12:51
문자열이 담긴 변수를 비교할 때 등호(==)를 써도 될까? 안 될 것은 없다. 비교하고 싶은 것이 주소인지, 실제 값인지에 따라 쓰임이 다를 뿐이다. 자바에서도 마찬가지인데, C++에서 문자열을 비교할 때 등호를 사용하게 되면 주소를 비교한다. 선언과 동시에 리터럴로 초기화한 문자열이라면 주소가 같기 때문에 등호로 검사하면 당연히 같다는 결과가 나온다. 디버깅으로 주소를 비교해보면 a, b는 주소가 같다. 같은 리터럴로 초기화했으니까. 1 2 3 4 5 6 7 8 9 10 11 12 #include #include int main() { const char* a = "I am so sorry"; const char* b = "I am so sorry"; if (a == b) printf("같다\n"); ..
-
pragma once는 만능이 아니다개발/C·C++ 2019. 9. 17. 21:33
pragma once 전처리기는 인클루드가 수행될 때 반복되는 걸 막는 기능을 할 뿐이다. pragma once를 사용했는데도 비주얼 스튜디오에서 LNK2005 오류가 발생하는 이유다. 소스코드의 빌드는 크게 세 가지 과정을 거친다. 전처리, 컴파일, 링킹으로 나눌 수 있는데, 전처리 과정에서는 소스 파일(cpp)에 있는 pragma, include, define 등의 지시자를 처리한다. 전처리 과정에서 문제가 없었으면 컴파일러는 전처리기기가 모두 코드로 대체된 순수한 C++ 소스 코드를 파싱해 어셈블리 코드로 만든다. 그다음에 기계 코드로 번역해 바이너리 파일을 만드는데 이것이 오브젝트 파일이다(.obj). 각각의 소스 코드 별로 독립적으로 컴파일이 완료되면 각각의 오브젝트 파일이 생성된다. 마지막으로..
-
미리 컴파일된 헤더를 쓰면서 생긴 문제 하나개발/C·C++ 2019. 9. 14. 20:25
콘솔에 로그를 출력할 때 색깔 등의 설정에 변화를 줄 수 있는 라이브러리가 있다(https://archive.codeplex.com/?p=cppconlib). 아직 이유는 파악 못했지만 해당 라이브러를 쓰기 위한 헤더 파일과 해당 헤더 파일을 인클루드 하는 헤더파일을 미리 컴파일된 헤더(like stdafx.h)에 넣어놓자(IOCP.h에서 Logger.h를 인클루드하는데, Logger.h가 conmanip.h를 인클루드하고 있고, IOCP.h와 Logger.h는 모두 미리 컴파일된 헤더에서 인클루드했다) 중복 정의 관한 오류인 LNK2005가 발생했다. 정확한 이유는 파악하지 못했다. 중복 문제를 일으킬 만한 인클루드 문제가 '확실하게 없고', 오류의 원인으로 지적된 _settextcolor() 함수나 ..
-
[Hyper-V] 게스트에 고정 IP 주기개발/서버 2019. 9. 2. 03:29
이유는 모르겠지만 사람마다 PC마다 묘하게 다른 부분이 있는지, 각종 포스트를 그대로 따라해봐도 제대로 되지 않았다. 한참 삽질을 하고 나서 적어도 내 PC 환경에 맞는 답을 찾아냈다. 기본 DNS 서버에 값을 설정해주면 됐다. DNS의 역할은 어렴풋이 알고 있지만 적지 않은 포스트에서 기입하지 않고도 성공했다고 하길래 저도 모르게 별로 중요하게 생각하지 않았던 게 화근이었다. 여러 포스트를 보면 원래의 PC(이하 호스트)의 Hyper-V 관리자에서 [가상 스위치 관리자]를 통해 외부 스위치를 만들곤 한다. 외부 스위치는 호스트의 물리적인 이더넷(LAN, WAN 등에 가장 많이 활용되는 기술 규격)과 같은 수준의 이더넷을 만드는데, 아직은 만들어야 할 이유를 모르겠다. 내부는 호스트 내부에 고유의 가상 ..
-
미리 컴파일된 헤더 오류개발/C·C++ 2019. 8. 20. 14:41
미리 컴파일된 헤더를 사용하기 위해 [미리 컴파일된 헤더]를 [사용]으로 변경하고 stdafx.h 혹은 사용하고자 하는 헤더를 새롭게 지정해서 헤더 파일을 만들었지만 오류가 발생했다. 옵션을 [만들기]로 변경한 뒤에는 미리 컴파일된 헤더 오류는 사라졌지만 [다중 프로세서 컴파일] 옵션과 충돌이 일어났다. 근본적인 해결방법 방법은 다음과 같다. 1. 프로젝트의 [속성 페이지]에 들어간다. 2. [C/C++]-[미리 컴파일된 헤더]에서 [미리 컴파일된 헤더]를 [사용(/Yu]로 바꾼다. 헤더 파일은 기본이 stdafx.h으로 되어 있다. 3. 모든 헤더에 stdafx.h를 인클루드한다(stdafx.h를 안 만들었으면 만든다). 4. stdafx.cpp를 만든다. 5. stdafx.cpp의 [속성 페이지]를 ..
-
이 작업을 수행하기 위해 이 파일과 연결된 앱이 없습니다개발/C·C++ 2019. 8. 20. 14:17
[로그인 서버] 프로젝트를 새로 만들고 서버 라이브러리(lib)을 참조해 디버깅 하지 않고 시작을 하고 난 뒤 생긴 오류다. 검색을 조금 해보니까 재배포 가능 패키지를 설치하거나 닷넷 프레임워크 버전을 올리면 된다는 말이 대부분이었다. 그대로 해봤지만 오류가 사라지지 않았다. 마이크로소프트 정식 문서를 통해 문제를 해결할 수 있었다. 라이브러리를 사용하고자 하는 어플리케이션(여기에서는 [로그인 서버] 프로젝트)를 전체 솔루션의 속성 페이지에서 [시작 프로젝트]로 지정하면 된다. 일단은 [한 개의 시작프로젝트] 옵션으로 해결했는데, [여러 개의 시작 프로젝트]는 말 그대로 동시에 여러 프로젝트를 실행하고자 할 때 선택하면 되는 것 같다.
-
비주얼 스튜디오에서 [언어 확장] 옵션개발/C·C++ 2019. 8. 16. 16:00
라이브러리를 하나 만들고, 한 프로젝트에서 그 라이브러리를 사용하려고 했다. 라이브러리 자체로 아무 문제가 없었는데, 프로젝트에서 가져다 쓰려니까 별 이상한 오류가 100개 넘게 생겼다. 이유를 하루 넘게 알 수 없었다. 처음에는 컴파일 순서 관련해서, 처음에 생성할 때 미리 컴파일된 헤더 때문인가 싶어 빈 프로젝트로 다시 생성하니까 오류가 안 났다. 몇 번 더 테스트를 하고자 프로젝트를 지우고 새로 만들기를 반복한 결과, 나도 모르게 건드렸던 설정 항목을 발견했다. [프로젝트 속성 페이지] - [C/C++] - [언어]에 있는 [언어 확장 사용 안 함]이었다. 작년에 C++ 문법 수업을 들을 때 강사가 이 옵션을 사용하게 되면 에러를 발생해야할 문법이 에러처리가 안 난다고 한 말이 머릿속에 남아 가끔씩..