您可以构建一个C++程序,以便(几乎)所有代码都驻留在Header文件中.它本质上看起来像一个C#或Java程序.但是,.cpp在编译时,至少需要一个文件来提取所有头文件.现在我知道有些人绝对会厌恶这个想法.但我没有发现任何令人信服的缺点.我可以列举一些优点:
[1]编译时间更快.所有头文件只被解析一次,因为只有一个.cpp文件.此外,一个头文件不能包含多次,否则您将获得构建中断.在使用备用方法时,还有其他方法可以实现更快的编译,但这很简单.
[2]通过使它们绝对清楚,它避免了循环依赖.如果ClassA在ClassA.h对循环依赖ClassB的ClassB.h,我必须把前向参考与它伸出.(请注意,这与C#和Java不同,编译器会自动解析循环依赖关系.这会鼓励编写错误的编码实践IMO).同样,如果您的代码在.cpp文件中,您可以避免循环依赖,但在实际项目中,.cpp文件往往包含随机标题,直到您无法确定谁依赖于谁.
你的意见?
c++ architecture compilation circular-dependency header-files
我正在寻找创建两个类,每个类包含另一个类类型的对象.我怎样才能做到这一点?如果我不能这样做,是否有一个解决方法,比如每个类包含一个指向另一个类类型的指针?谢谢!
这就是我所拥有的:
文件:bar.h
#ifndef BAR_H
#define BAR_H
#include "foo.h"
class bar {
public:
foo getFoo();
protected:
foo f;
};
#endif
Run Code Online (Sandbox Code Playgroud)
文件:foo.h
#ifndef FOO_H
#define FOO_H
#include "bar.h"
class foo {
public:
bar getBar();
protected:
bar b;
};
#endif
Run Code Online (Sandbox Code Playgroud)
文件:main.cpp
#include "foo.h"
#include "bar.h"
int
main (int argc, char **argv)
{
foo myFoo;
bar myBar;
}
Run Code Online (Sandbox Code Playgroud)
$ g ++ main.cpp
In file included from foo.h:3,
from main.cpp:1:
bar.h:6: error: ‘foo’ does not name a …Run Code Online (Sandbox Code Playgroud) 我在哪里可以找到C和C++中所有头文件的列表?
当我正在构建一个库时,我收到的错误就像' tree.h not found'.我想这是C和C++中的标准头文件.这让我了解了所有头文件及其贡献的好奇心.
我有搜索的地方吗?
我正在使用Solaris Unix.
我有一个包含多个文件的C程序,所以我有,例如,stuff.c它实现了一些函数,并stuff.h使用函数原型.
我该如何记录评论中的功能?
我应该在头文件中包含所有文档,文件中的所有文档.c,还是复制两者的文档?我喜欢后一种方法,但后来我遇到问题,我将更新其中一个文档而不是另一个(通常是我进行第一次修改的文件,即如果我先修改头文件,那么它的注释)将反映这一点,但如果我更新实施,只会更改那些评论).
这个问题及其答案也适用于C++代码 - 另请参阅我应该在哪里放置文档注释?
这可能是一个愚蠢的问题,但我现在在网上和网上搜索了很长一段时间并且无法得出一个明确的答案(我的尽职调查谷歌搜索).
所以我是编程的新手......我的问题是,主函数如何知道不同文件中的函数定义(实现)?
恩.说我有3个文件
//main.cpp
#include "myfunction.hpp"
int main() {
int A = myfunction( 12 );
...
}
Run Code Online (Sandbox Code Playgroud)
-
//myfunction.cpp
#include "myfunction.hpp"
int myfunction( int x ) {
return x * x;
}
Run Code Online (Sandbox Code Playgroud)
-
//myfunction.hpp
int myfunction( int x );
Run Code Online (Sandbox Code Playgroud)
-
我得到预处理器如何包含头代码,但是头和主函数如何知道函数定义是否存在,更不用说它了?
如果不清楚或者我对这里的新事物有很大误解,我会道歉
常用的路径分隔符有两种:Unix正斜杠和DOS反斜杠.安息吧,经典的Mac冒号.如果在#include指令中使用,它们是否符合C++ 11,C++ 03和C99标准的规则?
我刚刚发现以下内容无效.
//Header File
class test
{
const static char array[] = { '1', '2', '3' };
};
Run Code Online (Sandbox Code Playgroud)
初始化这个的最佳位置在哪里?
当我这样做:(
less /usr/include/stdio.h这只是一个C库 - 与C++无关)
我看了__THROW很多函数声明.此外,一些函数上面的评论说'这个函数是一个可能的取消点,因此没有标记__THROW'这是什么?
throw 用于异常处理...但据我所知,C不提供任何支持.
请解释.
编译器: g ++ 4.7.2
好.所以我对.h和.cpp文件中的默认参数感到困惑.许多地方(包括本网站)都提到默认参数只能添加到.h文件而不能添加到.cpp文件中.但是,这段代码证明错了:
test1.h
#pragma once
#include <iostream>
using namespace std;
class Class{
public:
Class(int, int, int=1);
};
Run Code Online (Sandbox Code Playgroud)
test1.cpp
#include "test1.h"
Class::Class(int a, int b=2, int c)
{
cout<<a<<" "<<b<<" "<<c<<endl;
}
int main()
{
Class a(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,根据我测试的内容,可以将默认参数添加到.cpp文件中.但是,以下限制包含:
存在于.cpp和.h文件中的默认参数不应重叠.即Class(a, b, c=1)(在.h文件中)和
Class::Class(a,b,c=2)(在.cpp文件中)无效.
众所周知,一旦添加了默认参数,之后声明的所有变量也必须包含默认值.让我们称之为defpara规则.现在,
函数声明(.h文件)中声明的变量应遵守defpara规则,即Class(a, b=2, c)(在.h文件中)无效,无论.cpp文件中声明的是什么.
如果考虑具有默认值的变量(作为.h和.cpp文件中的默认值的交集),它将遵循defpara规则.即Class(a, …
header-files ×10
c++ ×9
c ×4
compilation ×2
architecture ×1
arrays ×1
class ×1
comments ×1
exception ×1
include ×1
iostream ×1
oop ×1
pointers ×1