【发布时间】:2011-03-17 17:13:06
【问题描述】:
我最近意识到,一般来说,我不知道 c/c++ 编译器是如何工作的。我承认这最初来自于试图理解标头守卫,但后来意识到我缺乏编译的工作原理。
以Visual C++为例;有“头文件”文件夹、“资源文件”文件夹和“源文件”文件夹。这些文件夹的分离以及您放入其中的内容有什么意义吗?对我来说,它们都是源文件。取代码sn-ps:
片段 1
//a1.h
int r=4;
和
//a1.cpp
int b //<--semicolon left out on purpose
和
//main.cpp
#include <iostream>
#include "a1.h"
void main()
{
cout << r;
}
编译器错误提示“a1.cpp(3) : fatal error C1004: unexpected end-of-file found” 我预计不会因为 a1.cpp 文件在 main 方法中没有#included存在于下一个代码sn-p的位置
片段 2
//a1.h
int r=4 //<--semicolon left out on purpose
和
//a1.cpp
int b = 4;
和
//main.cpp
#include <iostream>
void main()
{
cout << b;
}
因为“main.cpp(6) : error C2065: 'b' : undeclared identifier”而出错。如果你像这样包含 a1.cpp
片段 3
//a1.h
int r=4 //<--semicolon left out on purpose
和
//a1.cpp
int b = 4;
和
//main.cpp
#include <iostream>
#include "a1.cpp"
void main()
{
cout << b;
}
编译器抱怨“a1.obj : error LNK2005: "int b" (?b@@3HA) already defined in main.obj”。 sn-ps 2 和 3 都忽略了 int r = 4 没有缺少分号的事实,因为我怀疑它与它的 xxxx.h 文件有关。如果我从 sn-p 1 上的项目中删除 a1.cpp 文件,那么它编译得很好。显然,我所期望的不是我得到的。有很多关于如何在 cpp 中编码的书籍和教程,但 cpp 在编译过程中处理文件和源代码的方式并不多。这到底是怎么回事?
【问题讨论】:
-
你需要对头文件和源文件的区别有一些非常基本的了解,加上“项目”(或Makefile)的含义。你能从读K&R的书开始吗?它不是 C++,但你的代码也不是——它是纯 C(除了
-
我总是建议 C/C++ 新手使用命令行编译器并在进入 IDE 之前手动链接代码。了解编译/链接/执行过程在 C/C++ 中非常重要。坐下来,放松一下,GCC 一会儿。
-
@Brandon 你的意思是在 linux/unix 环境中吗?或者会有windows端口吗?另外,我想看什么样的文学作品?
-
您可以使用 MinGW 或 Cygwin,但 Visual Studio 构建在 MS 的编译器之上。 C++ 版本称为 cl.exe。 msdn.microsoft.com/en-us/library/f35ctcxw(v=vs.71).aspx至于文学(stackoverflow.com/questions/388242/…)
标签: c++ ide header compiler-errors build-system