为什么静态成员不能在头文件中用#pragma定义一次?

Staitc成员必须在sourcefile(.cpp)中定义,因为headerfile(.h)与许多sourcefiles共享,重复定义会导致错误。然而,如果我在heaerfile的开头输入’#pragma’一次(或使用#ifndef, #endif),它将只运行一次headerfile。那为什么我们还需要在源文件中初始化静态成员?

// This is string1.h 
#pragma once
#include <cstring>                 // string.h for some


using std::ostream;
using std::istream;

static int num_strings=1; //why this still gives multiple definiton error even with #proagma once at top?
class String
{
private:
    static int num_strings; // number of objects
} 

解决方案:

你的推理是错误的。头卫是为了防止在一个翻译单元中包含超过一次的头。假设你有两个源文件,那么这两个文件将被分开编译。

// foo.cpp
#include "theheader.h"

// bar.cpp
#include "theheader.h"
#include "someotherheader.h"

那么这两个文件将被分开编译, 每个文件都有头的内容. 头保护只防止包含 “theheader.h “两次,例如另一个头是

// someotherheader.h
#include "theheader.h"

总结一下,我允许自己盗用一个评论。”Include guards避免文件在同一个翻译单元中被多次收录,而不是跨越多个翻译单元”

给TA打赏
共{{data.count}}人
人已打赏
解决方案

数据库推荐自定义字段

2022-5-12 8:00:19

解决方案

如何用regex替换代码内的.字符?

2022-5-12 8:00:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索