Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
完全相同的C++代码给出不同的输出_C++ - Fatal编程技术网

完全相同的C++代码给出不同的输出

完全相同的C++代码给出不同的输出,c++,C++,所以在问这个问题之前,我试图找到答案,但我发现人们的代码中有错误,或者代码实际上并不完全相同 我的问题是完全相同的代码,唯一的区别是不同的文件名。两个文件夹、两个项目、不同的文件名、相同的代码(包含行除外) 代码和输出的比较。左边的代码正在运行,完成后向量大小为2 这是代码:项目A文件名/项目B文件名 main.cpp/main.cpp 项目B: Start of Class 0 1 Stab End of Class Start of main 0 1 End of main 我道歉如果我

所以在问这个问题之前,我试图找到答案,但我发现人们的代码中有错误,或者代码实际上并不完全相同

我的问题是完全相同的代码,唯一的区别是不同的文件名。两个文件夹、两个项目、不同的文件名、相同的代码(包含行除外)

代码和输出的比较。左边的代码正在运行,完成后向量大小为2

这是代码:项目A文件名/项目B文件名

main.cpp/main.cpp 项目B:

Start of Class
0
1
Stab
End of Class
Start of main
0
1
End of main
我道歉如果我的代码凌乱或者我笨拙地做事,我刚刚开始学习C++,这是我尝试创建一个纸牌游戏。所以最大的问题是为什么相同的代码给出不同的输出?
谢谢

全局变量的初始化顺序仅为单个变量定义良好。翻译单位之间的顺序未定义。这就是这里发生的事情


您无法知道是先初始化Card.cpp中的K,还是先初始化test.cpp中的Stab。

请尝试将其精简为一个值。修剪的过程可能会帮助您找到bug,并且它肯定会使我们更容易尝试复制它。目前,对于一个好问题来说,有太多无关的代码。你也可以尝试预处理这两个版本,只处理includes和macros,然后比较结果,看看实际的差异在哪里。使用g++或clang++时,您可以使用-E选项来执行此操作。@BoBTFish没有错误,代码在我的项目A上运行得很好。问题是为什么相同的副本不工作。如果没有错误,您就不会在这里问这个问题。。。你只是不知道bug在哪里,这很好,这就是网站的用途。碰巧,我的评论没有那么大帮助,一些程序员已经发现了这个bug。这是一个概念,C++和相关的语言,例如C语言,不掌握你的手。如果您做了非法的事情,您可能不会收到错误消息。它可能会崩溃,甚至看起来可以工作,偶尔只会给出奇怪的输出。这不应该破坏这两个项目吗?我不明白为什么它在我的项目A中按预期工作。谢谢你的回答,我会努力解决它。@MantasKandratavicius,这对你来说是不确定的行为。有时它似乎工作得很好,但在接下来的一分钟里,它就会崩溃。我明白了,谢谢。我会仔细阅读的。我想这回答了我的问题。
#include "class.h" //this would be "Card.h" in project B
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<string> K;

Card::Card(string card_name         ,
           string card_type         ,
           bool   card_active       ,
           bool   card_discardable  ,
           bool   card_heals        ,
           bool   card_deals_damage ,
           bool   card_draws        ,
           bool   card_blocks       ,
           bool   card_discards     ,
           void (*card_pointer)()   )
{
    Name            = card_name         ;
    Type            = card_type         ;
    Active          = card_active       ;
    Discardable     = card_discardable  ;
    Heals           = card_heals        ;
    Deals_damage    = card_deals_damage ;
    Draws           = card_draws        ;
    Blocks          = card_blocks       ;
    Discards        = card_discards     ;
    Execution       = card_pointer      ;
    cout<<"Start of Class"<<endl;
    cout<<K.size()<<endl;
    K.push_back(Name);
    cout<<K[0]<<endl;
    cout<<K.size()<<endl;
    cout<<"End of Class"<<endl;
}
string Card::getName()
{
    return Name;
}
void Card::execute()
{
    Execution();
}    
#ifndef CARD_H
#define CARD_H
#include <string>
#include <vector>

extern std::vector<std::string> K;

class Card
{
    public:
        Card(   std::string    card_name        ,
                std::string    card_type        ,
                bool           card_active      ,
                bool           card_discardable ,
                bool           card_heals       ,
                bool           card_deals_damage,
                bool           card_draws       ,
                bool           card_blocks      ,
                bool           card_discards    ,
                void (*card_pointer)()          );
        std::string getName();
        void execute();
    private:
        std::string Name        ;
        std::string Type        ;
        bool        Active      ;
        bool        Discardable ;
        bool        Heals       ;
        bool        Deals_damage;
        bool        Draws       ;
        bool        Blocks      ;
        bool        Discards    ;
        void      (*Execution)();
};



#endif
#include <iostream>
#include "class.h"
void execute_stab()
{
    std::cout<<"You dealt 2 dmg to enemy player"<<std::endl;
}
Card Stab("Stab", "Offensive", false, true, false, true, false, false, false, execute_stab);
Start of Class
0
1
Stab
End of Class
Start of main
1
2
End of main
Start of Class
0
1
Stab
End of Class
Start of main
0
1
End of main