effective c++의 item1을 읽고...궁금한점..

junteken의 이미지

오늘 부터 effective c++를 혼자서 독학하고 있는 사람입니다.
아직 내공이 많이 부족해서인지 잘 이해가 가지 않는 점이
많이 있습니다...책도 원서이고 보니...영어도 짧아서...
많은 어려움이 있습니다....
먼저 제가 궁금한점은 다음과 같습니다.

1. Item 1에 보면 preprocessor보다는 compiler를 더 선호하라는데요...그 이유인즉 예를 들어 #define PI 3.14159 를 선언했을때 이것은 symbol table에 포함이 안되기 때문이라고 합니다..
이 symbol table이 정확이 무엇을 말하는지 궁금합니다...
그리고 계속 읽어보면 symbolic debugger이라는 용어도 나오는데요....이것도 정확이 무엇인지 의미가 잘 와닫지 않네요..

2. header file에 존재하는 constant definition을 가리키는 pointer변수를 생성할때 const형을 두번쓰라는것이 잘 이해가 안됩니다. 물론 값을 변경시키지 않을 목적으로 const를 한번쓰는 것은 이해가 가지만, 후에 그 포인터 변수를 다른 constant definition의 값을 가지도록 할수도 있는거 아님니까?
다음은 책에 나온 선언 형태입니다.
const char * const authorName= "Scott Meyers";

이상 두가지 질문인데요....맨날 질문만 올려서 죄송하네요..
답변도 몇개 달아보았지만 별로 도움은 안되었을듯...^^
그럼 수고하세요~~~

익명 사용자의 이미지

2번은 아예 바뀌지 않을거라는걸로

즉 define과 같은 용도로 쓰라는 얘기 아닌가요?

익명 사용자의 이미지

2번은 아예 바뀌지 않을거라는걸로

즉 define과 같은 용도로 쓰라는 얘기 아닌가요?

aqwerf의 이미지

1. Preprocessor 보다 변수로 하라는 것은 debugging을 직접 해보면 이유를 압니다. 예를 들어 위처럼 define문을 사용하는 경우 PI를 debugger에서는 값을 볼 수 없습니다. 위와 실제적으로 동일하지만
const float PI=3.14159;
처럼 하여 사용을 하면 debugger에서 PI의 값을 볼 수 있습니다.
symbol table이라는 것은 변수,함수들의 이름을 모아놓은 table이라고 보면 되죠. 상수 값은 여기에 저장하지 않습니다.
직접 아무 디버거나 사용하다 보면 왜 그런지 아실 거에요.

2. 두 const가 다르죠. 앞의 const는 "Scott Meyers"가 const라는 거고, 뒤위 것은 const int i = 10 처럼 포인터가 const라는 것을 말하죠.
일반적인 경우에는 const를 쓰나 안쓰나 큰 차이는 없지만, 값을 잘 못 수정하는 경우 컴파일 에러가 발생하므로 좀 더 안전하다고 할 수 있죠. emedded환경에서는 롬에서 실행되는 경우 불필요한 메모리를 줄일 수 도 있고요.

cinsk의 이미지

Quote:

1. Item 1에 보면 preprocessor보다는 compiler를 더 선호하라는데요...그 이유인즉 예를 들어 #define PI 3.14159 를 선언했을때 이것은 symbol table에 포함이 안되기 때문이라고 합니다..
이 symbol table이 정확이 무엇을 말하는지 궁금합니다...

source file을 object file로 만들때, 실제 변수의 위치를 알기 위해, 또는 외부 변수의 주소를 알기 위해 (name, address) 형태의 테이블이 들어갑니다. 이 것을 symbol table이라고 합니다.

Preprocessor는 컴파일하기 전에 거치는 것이므로, 실제 compiler 입장에서는 PI를 볼 수 없죠. PI가 처리된 3.14... 를 보기 때문에 symbol table에 포함되지 않습니다.

Quote:

그리고 계속 읽어보면 symbolic debugger이라는 용어도 나오는데요....이것도 정확이 무엇인지 의미가 잘 와닫지 않네요..

Debugging할 때, symbol을 보여주는 debugger를 symbolic debugger라고 합니다. 일반적으로 보통 쓰는 debugger가 다 symbolic debugger입니다. Symbolic debugger나 source-level debugger나 다 비슷한 것이고, 반대로는 low-level debugger, machine-language debugger라고, DOS나 Windows에 포함되어 있는 debug.com (또는 debug.exe)가 여기에 해당하는 데, 이 구분은 별로 중요하지 않습니다. 그냥 debugger다고 생각하시는게 편합니다.

Quote:

2. header file에 존재하는 constant definition을 가리키는 pointer변수를 생성할때 const형을 두번쓰라는것이 잘 이해가 안됩니다. 물론 값을 변경시키지 않을 목적으로 const를 한번쓰는 것은 이해가 가지만, 후에 그 포인터 변수를 다른 constant definition의 값을 가지도록 할수도 있는거 아님니까?

그것은 preprocessor의 기능을 대체하기 위해서 그렇게 쓴 것입니다. 물론 preprocessor macro도 #undef한 다음 다시 정의할 수 있지만..
const의 위치에 따라, 몇가지로 나눌 수 있는데,
여기를 참고하기 바랍니다.
junteken의 이미지

아 답변 주신 모든분들 감사드립니다.
즐거운 하루 되세요~~ :D

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.