홈강좌Rust 입문·중급 47편 중 2편째
Rust 컴파일 오류 읽는 법 — 무엇·어디·고치는 법 세 군데만 본다
Rust 컴파일 오류는 길어 보여도 세 군데만 읽으면 된다. 첫 줄의 error 가 무엇이 틀렸는지, --> 줄이 어디인지, help: 줄이 고치는 법이다. 오류를 고치는 동안에는 실행 파일을 만들지 않는 cargo check 로 빨리 확인한다.
01 느낌표 하나를 빠뜨려 본다
1편의 hello 에서 두 번째 println! 의 느낌표를 지우고 cargo run 을 친다.
fn main() {
println!("Hello, world!");
println("Hello, Rust!");
} Compiling hello v0.1.0 (~/projects/hello)
error[E0423]: expected function, found macro `println`
--> src/main.rs:3:5
|
3 | println("Hello, Rust!");
| ^^^^^^^ not a function
|
help: use `!` to invoke the macro
|
3 | println!("Hello, Rust!");
| +
For more information about this error, try `rustc --explain E0423`.
error: could not compile `hello` (bin "hello") due to 1 previous error- 무엇 —
error[E0423]줄. 함수(function)가 와야 할 자리에 매크로(macro)println이 왔다는 뜻이다.E0423은 오류 번호다. - 어디 —
-->줄의src/main.rs:3:5. 3번째 줄의 5번째 글자다. 바로 아래에 그 줄을 다시 보여 주고^로 짚는다. - 고치는 법 —
help:줄. 느낌표를 붙이라고 하고, 넣을 자리를+로 표시했다.
나머지 줄은 처음에는 건너뛰어도 된다. 끝의 두 줄은 "더 알고 싶으면 rustc --explain E0423 을 쳐 보라" 는 안내와 "그래서 컴파일하지 못했다" 는 마무리다.
02 번호가 없는 오류도 있다
이번에는 첫 println! 끝의 세미콜론을 지운다.
fn main() {
println!("Hello, world!")
println!("Hello, Rust!");
}error: expected `;`, found `println`
--> src/main.rs:2:30
|
2 | println!("Hello, world!")
| ^ help: add `;` here
3 | println!("Hello, Rust!");
| ------- unexpected token문법 자체가 틀리면 번호 없이 error: 로만 시작한다. 읽는 법은 같다.
- 무엇 —
;가 와야 하는데println이 왔다. - 어디 — 2번째 줄 끝이다. 3번째 줄의
println에도 밑줄이 있는데, 컴파일러는 3번째 줄을 읽고 나서야 앞 줄이 안 끝났다는 것을 알기 때문이다. - 고치는 법 —
help: add ; here. 2번째 줄 끝에 세미콜론을 넣는다.
Rust 는 문장 하나가 끝날 때마다 세미콜론을 찍는다.
03 짚는 자리가 엉뚱할 때도 있다
main 을 mian 으로 잘못 쓰면 이렇게 나온다.
fn mian() {
println!("Hello, world!");
}error[E0601]: `main` function not found in crate `hello`
--> src/main.rs:3:2
|
3 | }
| ^ consider adding a `main` function to `src/main.rs`무엇 줄은 "main 함수를 찾지 못했다" 고 말한다. 그런데 어디 줄은 3번째 줄의 } 를 가리킨다. 거기가 틀렸다는 뜻이 아니라, 파일 끝까지 읽었는데 main 이 없었다는 뜻이다. 이럴 때는 무엇 줄을 믿고 직접 찾는다. 범인은 1번째 줄의 mian 이다.
04 오류를 고치는 동안에는 cargo check
cargo check 는 컴파일 검사만 하고 실행 파일은 만들지 않는다. 그래서 cargo run 보다 빠르다. 다 고친 hello 에서 치면 이렇게 끝난다.
cargo check Checking hello v0.1.0 (~/projects/hello)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.12s첫 단어가 Compiling 이 아니라 Checking 이고 Running 줄이 없다. 실행하지 않았기 때문이다. 고치는 동안에는 cargo check, 다 고치면 cargo run 으로 돌린다.
05 실습 — help 가 없는 오류 읽기
이번에는 닫는 따옴표를 빠뜨렸다. 세 군데로 읽어 보자.
fn main() {
println!("Hello, world!);
} Compiling hello v0.1.0 (~/projects/hello)
error[E0765]: unterminated double quote string
--> src/main.rs:2:14
|
2 | println!("Hello, world!);
| ______________^
3 | | }
| |__^
For more information about this error, try `rustc --explain E0765`.
error: could not compile `hello` (bin "hello") due to 1 previous error- 무엇 — 큰따옴표로 연 문자열이 끝나지 않았다(unterminated double quote string).
- 어디 — 2번째 줄 14번째 글자, 여는 따옴표 자리다. 그 아래 선이 3번째 줄까지 이어지는 것은 문자열이 파일 끝까지 이어진다고 읽었다는 표시다.
- 고치는 법 — 이번에는
help:줄이 없다. 무엇과 어디를 보고 직접 고친다.world!뒤에"를 넣으면 된다.
help: 는 컴파일러가 고칠 방법을 확신할 때만 나온다. 없으면 무엇과 어디만으로 충분하다. 다음 편부터는 변수를 만들어 보면서 Rust 의 문법을 하나씩 다룬다.