这个文件被编译了两次吗?

时间:2017-09-15 05:33:47

标签: c++ compilation

假设#include <something.h>包含在A.cpp和B.cpp

如果我在A.cpp中运行某个功能“A”并在主要的B.cpp中运行“B”,

“something.h”编译两次吗?还是一次?

2 个答案:

答案 0 :(得分:0)

错误的问题。编译的内容在技术上不是源文件,而是translation unit

阅读更多关于C ++和一些reference网站的书籍。

详细了解各种compilation phases,其中包括preprocessing

因此,假设您的编译器在Linux上为GCC,您将编译A.cpp源文件(也是其中使用的标题,因此是翻译单元)

 g++ -Wall -Wextra -g -c A.cpp -o A.o

其中-Wall要求几乎所有警告,-Wextra要求更多警告,-g要求调试信息(在Linux上为DWARF格式),-c要求仅编译,-o A.o要求对象文件为A.o

您可以要求编译器使用-H选项显示每个包含的标头。

您可以使用

获取预处理表单
g++ -Wall -Wextra -g -C -E A.cpp > A.ii

然后您可以使用寻呼机(或编辑器)查看生成的A.ii文件。

当然,预处理会包括标题的预处理形式#include - d

答案 1 :(得分:-1)

因为它是标题,所以它不是“编译”的。 它包含在您的代码中。

为了避免一些尴尬的情况,你必须像这样保护你的标题:

public IHttpActionResult Post(footer_image_dets footer_image_detail)
    {
        if (ModelState.IsValid)
        {
            var parent = db.footer_images.Find(footer_image_detail.Id);
            if (parent != null) 
            {
              parent.footer_image_dets.Add(footer_image_detail);
              // it will work normally if you dont have child model(because  
              // your foreign key is key and there cant be inserted second  
              // row by same id, if you have child model you can update it,  
              // it depends on your logic do you want to have one-to-one 
              // reletion or no... )
              db.SaveChanges();
            }
            else 
            {
              //Create exception or yous specific logic here
            }
        }           
        return CreatedAtRoute("DefaultApi", new { id = footer_image_detail.id }, footer_image_detail);           
    }