在C和C++编程语言中,使用尖括号和在include
语句中使用引号有什么区别,如下所示?
#include <filename>
#include "filename"
传统上,避免C++中多个头部包含的标准和可移植方法是使用#ifndef - #define - #endif
预编译器指令方案,也称为宏保护方案(参见下面的代码片段).
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
Run Code Online (Sandbox Code Playgroud)
然而,在大多数实现/编译器中(见下图),有一个更"优雅"的替代方案,其功能与调用的宏保护方案相同#pragma once
.#pragma once
与宏保护方案相比具有几个优点,包括更少的代码,避免名称冲突,有时提高编译速度.
做了一些研究,我意识到尽管#pragma once
几乎所有已知的编译器都支持指令,但是指令是否#pragma once
是C++ 11标准的一部分还是存在紊乱.
#pragma once
指令是否属于C++ 11标准的一部分吗?#pragma once
)的优点/缺点,那也是很好的.所以我完成了我的第一个C++编程任务,并获得了我的成绩.但根据评分,我失去了分数including cpp files instead of compiling and linking them
.我不清楚这意味着什么.
回顾一下我的代码,我选择不为我的类创建头文件,但是在cpp文件中做了所有事情(它看起来没有头文件......).我猜这个评分者意味着我写了'#include'mycppfile.cpp";' 在我的一些文件中.
我#include
对cpp文件的推理是: - 应该进入头文件的所有东西都在我的cpp文件中,所以我假装它就像一个头文件 - 在猴子看猴子做时尚,我看到了其他头文件#include
在文件中是'd,所以我为我的cpp文件做了同样的事情.
那究竟是我做错了什么,为什么不好呢?
哪些头文件为不同的x86 SIMD指令集扩展(MMX,SSE,AVX,...)提供内在函数?似乎不可能在网上找到这样的清单.如我错了请纠正我.
在我们所有的C++课程,所有的老师总是把using namespace std;
在之后#include
在它们的S .h
文件.从那时起,我觉得这很危险,因为在另一个程序中包含该标题我会将命名空间导入到我的程序中,可能没有意识到,打算或想要它(标题包含可以非常深入嵌套).
所以我的问题是双重的:我是对的,using namespace
不应该在头文件中使用,和/或是否有某种方法来撤消它,例如:
//header.h
using namespace std {
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
还有一个问题是:标题文件是否应该是#include
相应.cpp
文件所需的所有标题,只有那些标题定义所需的标题,并让.cpp
文件#include
为其余标题,或者没有,并声明它需要的所有内容extern
?
问题背后的原因与上面相同:在包含.h
文件时我不想要惊喜.
另外,如果我是对的,这是一个常见的错误吗?我的意思是在现实世界的编程和"真正的"项目中.
谢谢.
假设我有一个带有规则的makefile
%.o: %.c
gcc -Wall -Iinclude ...
Run Code Online (Sandbox Code Playgroud)
我想要在头文件更改时重建*.o.无论何时/include
更改任何头文件,都必须重建dir中的所有对象,而不是计算出依赖项列表.
我想不出一个改变规则以适应这个的好方法,我愿意接受建议.如果标题列表不必硬编码,则奖励积分
通常我们使用
@interface interface_name : parent_class <delegates>
{
......
}
@end
Run Code Online (Sandbox Code Playgroud)
在.h文件和.m文件中的方法中,我们合成了在.h文件中声明的变量的属性.
但是在某些代码中,这个@interface ..... @ end方法也保存在.m文件中.这是什么意思?他们之间有什么区别?
还要提供一些关于.m文件中定义的接口文件的getter和setter的话.
提前致谢
考虑一对两个源文件:接口声明文件(*.h
或*.hpp
)及其实现文件(*.cpp
).
让*.h
文件如下所示:
namespace MyNamespace {
class MyClass {
public:
int foo();
};
}
Run Code Online (Sandbox Code Playgroud)
我在源文件中看到了两种不同的使用命名空间的做法:
*.cpp
练习#1:
#include "MyClass.h"
using namespace MyNamespace;
int MyClass::foo() { ... }
Run Code Online (Sandbox Code Playgroud)
*.cpp
练习#2:
#include "MyClass.h"
namespace MyNamespace {
int MyClass::foo() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我的问题:这两种做法之间是否有任何差异,哪一种被认为比另一种更好?
header-files ×10
c++ ×7
namespaces ×2
c ×1
c++11 ×1
c++14 ×1
dependencies ×1
getter ×1
include ×1
interface ×1
intrinsics ×1
macros ×1
makefile ×1
objective-c ×1
setter ×1
simd ×1
sse ×1
x86 ×1