许多语言(如Java,C#)不会将声明与实现分开.C#有一个部分类的概念,但实现和声明仍然保留在同一个文件中.
为什么C++没有相同的型号?拥有头文件更实用吗?
我指的是当前和即将推出的C++标准版本.
我知道PC-Lint可以告诉你包含但未使用的标题.有没有其他工具可以做到这一点,最好是在Linux上?
我们拥有一个庞大的代码库,在过去的15年中已经看到了大量的功能,但是当功能从一个实现文件移动到另一个实现文件时,很少会删除剩余的#include指令,这一点让我们陷入了相当糟糕的状态.显然我可以去除所有#include指令并让编译器告诉我哪些重新包含,但是我宁愿反过来解决问题 - 找到未使用的指令 - 而不是重建已使用的指令列表.
关于包括警卫的两个常见问题:
第一个问题:
为什么不包括保护我的头文件不受相互的,递归包含的警卫?我不断收到有关不存在的符号的错误,这些符号显然存在,甚至每次我写下类似的东西时都会出现更奇怪的语法错误:
"啊"
#ifndef A_H
#define A_H
#include "b.h"
...
#endif // A_H
Run Code Online (Sandbox Code Playgroud)
"BH"
#ifndef B_H
#define B_H
#include "a.h"
...
#endif // B_H
Run Code Online (Sandbox Code Playgroud)
"的main.cpp"
#include "a.h"
int main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到编译"main.cpp"的错误?我需要做些什么来解决我的问题?
第二个问题:
为什么不包括防止多个定义的警卫?例如,当我的项目包含两个包含相同标题的文件时,链接器有时会抱怨多次定义某个符号.例如:
"header.h"
#ifndef HEADER_H
#define HEADER_H
int f()
{
return 0;
}
#endif // HEADER_H
Run Code Online (Sandbox Code Playgroud)
"source1.cpp"
#include "header.h"
...
Run Code Online (Sandbox Code Playgroud)
"source2.cpp"
#include "header.h"
...
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我需要做些什么来解决我的问题?
编写C++ 11代码以在类的头文件中为类成员设置默认值时,这是一种好习惯吗?
或者在类的构造函数中执行此操作更好?
编辑:
我的意思是:
foo.h:
#include <string>
using std::string;
class Foo{
private:
string greet = "hello";
public:
Foo();
};
Run Code Online (Sandbox Code Playgroud)
VS
foo.cpp(当然有必要的头文件,但没有类内初始化):
Foo::Foo(){
greet = "hello";
}
Run Code Online (Sandbox Code Playgroud)
哪一个更好,为什么?
我通过import语句成功地从Objective C(针对目标'MyApp')调用我的Swift类:
#import "MyApp-Swift.h"
Run Code Online (Sandbox Code Playgroud)
我现在创建了一个名为"MyAppLite"的新目标
当我编译新目标时,我得到错误,因为代码需要"MyApp-Swift.h",但编译器正在创建"MyAppLite-Swift.h"
所以,我需要为#import我正在编译的目标创建一个条件Swift/ObjC头.
如何做到这一点,还是有更好的方法?
我正在使用TCP将文件从客户端发送到服务器.为了标记文件的结尾,我想在实际数据之前发送文件大小.所以我使用stat系统调用来查找文件的大小.这是类型off_t.我想知道它占用了多少字节,以便我可以在服务器端正确读取它.它定义于 <sys/types.h>.但我不明白这个定义.它只是定义__off_t or _off64_t为off_t.在哪里寻找__off_t?它__也是为头文件中的大部分内容添加前缀的约定,当我读取头文件以更好地理解时会让我感到害怕.如何更好地阅读头文件?
#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif
Run Code Online (Sandbox Code Playgroud) 为什么在项目中我应该包含一些*.lib,.h或其他一些文件?这些东西用于什么?
我有一个有很多小功能的课.通过小函数,我的意思是不执行任何处理但仅返回文字值的函数.就像是:
string Foo::method() const{
return "A";
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个头文件"Foo.h"和源文件"Foo.cpp".但由于函数非常小,我正在考虑将它放在头文件中.我有以下问题:
我希望能够在头文件中创建一个函数集合,我可以在我的一个C程序中#include.
好吧,无论如何不是C/C++专家,但我认为头文件的目的是声明函数,然后C/CPP文件来定义实现.
但是,今晚回顾一些C++代码,我发现这是在类的头文件中...
public:
UInt32 GetNumberChannels() const { return _numberChannels; } // <-- Huh??
private:
UInt32 _numberChannels;
Run Code Online (Sandbox Code Playgroud)
那么为什么标题中有实现呢?是否与const关键字有关?这是内联类方法吗?与定义CPP文件中的实现相比,这样做的好处/意义究竟是什么?
header-files ×10
c++ ×7
c ×2
c++-faq ×1
c++11 ×1
coding-style ×1
constructor ×1
dll ×1
function ×1
modular ×1
networking ×1
objective-c ×1
performance ×1
sockets ×1
swift ×1
target ×1
types ×1
windows ×1