【问题标题】:Compilation is successful even if function definition is missing [duplicate]即使缺少函数定义,编译也会成功[重复]
【发布时间】:2017-01-03 00:33:38
【问题描述】:

我从this 问题中借用了示例。有以下文件:

ma​​in.cpp

#include <iostream>
#include "foop.h"

int main(int argc, char *argv[])
{
int x=42;
std::cout << x <<std::endl;
std::cout << foo(x) << std::endl;
return 0;
}

foop.h

#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif

foop.cpp

int foo(int a){
    return ++a;
}

如您所见,main.cpp 包含foop.h,但foop.h 仅包含声明而不包含函数foo 的定义。 main.cpp 如何知道foop.cpp 的存在以及foo 函数的定义?我的第一个猜测是,如果 *.h 的名称与 *.cpp 的名称相同,那么它会以某种方式神奇地起作用,但是当我将 foop.cpp 重命名为 foop2.cpp 时它也起作用了

PS:我将文件保存在一个项目下,在 Visual Studio 的同一目录中

PPS:我能否以某种方式调试编译过程,以便查看发生了什么?

【问题讨论】:

  • 每个问题一个问题,这样可以更容易地写出简洁的答案或找到合适的欺骗(如果适用)。
  • I keep files under one project, - 这是重要的部分。 MSVC++ 项目只是一组文件(一旦编译)应该链接在一起。对于不同项目中的文件,您需要将一个项目设为库项目并告诉另一个项目使用第一个项目。
  • @MSalters 谢谢,这应该是一个答案。

标签: c++ visual-studio compilation include c-preprocessor


【解决方案1】:

编译器不需要知道定义。这是链接器的工作。

【讨论】:

  • 如果我理解正确,那么当我在 Visual Studio 中运行构建时,编译器会编译项目内部的所有文件(如果它们在语法上是正确的,即使它们只是没有 main() 的函数定义),然后链接器添加通过使用重复问题中提到的技术(符号表)将它们组合在一起?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多