c++链接错误,始终想不通
天蓬老师
天蓬老师 2017-04-17 15:37:39
0
2
424

------------------- 文件 1.h -----------------------------------

#pragma once
class A
{
public:
    static int x;

public:
    void func();
};

int A::x = 1;

-------------------- 文件 1.cpp -----------------------

#include "1.h"

void A::func()
{
    ;
}

-------------------- 文件 main.cpp -----------------------

#include<iostream>
#include"1.h"

int main()
{
    A a;

    return 0;
}

一起运行报错:

int A::x = 1;是应该放在cpp里,但是放在.h里的话,#pragma once防止头文件被二次编译,怎么还会报错呢,我的理解是如果去掉#pragma once它才会报这样的错,但是事实却是这样,我不知道这是为什么?或者我对#pragma once的理解有误?(PS:不要讨论#ifndef...#define...#endif#pragma once的区别,重点不是这个)

我的想法是二次编译(网上博文看来的)这个说法是不是错的,#pragma once到底是为了防止头文件被二次啥啥呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全員に返信(2)
伊谢尔伦

これは、int A::x が 1.cpp と main.cpp でそれぞれ 2 回定義されており、リンカーはどちらが正しいかを認識していないためです。

1.cpp に int A::x = 1; を入れることができます。

pragma Once の機能は、複数のコンパイルを防ぐことではなく、複数回インクルードすることです。pragma Once を記述するかどうかに関係なく、1.h を含む各 cpp ファイルは、1.h のコピーをコンパイル単位にコピーします。コンパイル時、pragma Once の機能は、同じヘッダー ファイルを (直接的または間接的に) 複数回インクルードしないことです。

ああ

リーリー

main.cpp

リーリー

main.cpp は、a.h が 1 回だけインクルードされるため、int a を再定義しなくても通常どおりコンパイルできます。

いいねを押す +0
左手右手慢动作

どちらの回答でも、ヘッダー ファイルには問題が発生していないことがわかりました。それなのに、なぜまだ解決しようとしているのですか? 私はあなたにすべての問題を話しました。


int A::x = 1; この文は通常、データ メンバーの初期化はコンストラクターで行われます。

1.cpp

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート