假设#include <something.h>
包含在A.cpp和B.cpp
如果我在A.cpp中运行某个功能“A”并在主要的B.cpp中运行“B”,
“something.h”编译两次吗?还是一次?
答案 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);
}