C++ 代码块中的模糊编译

C++ 代码块中的模糊编译,c++,codeblocks,C++,Codeblocks,我有两个头文件,比如h1和h2,在这两个文件中我都使用了uint8\u t,在h1中我使用了uint8\u t,没有,include它编译成功,但对于h2中的相同文件,编译器给出错误:uint8\u没有命名类型#在成功编译中包含“ing”stdint.h结果 有人能解释一下这种模棱两可的编译器行为吗。我正在使用代码块16.01 h1: //即使我没有包含并使用uint8\u t,也没有错误 #ifndef AES_加密 #定义AES\u加密\u H 类AES_加密 { 私人: 静态常数8_t S

我有两个头文件,比如h1和h2,在这两个文件中我都使用了
uint8\u t
,在h1中我使用了
uint8\u t
,没有
,include
它编译成功,但对于h2中的相同文件,编译器给出错误:uint8\u没有命名类型#在成功编译中包含“ing”
stdint.h
结果

有人能解释一下这种模棱两可的编译器行为吗。我正在使用代码块16.01

h1:

//即使我没有包含并使用uint8\u t,也没有错误
#ifndef AES_加密
#定义AES\u加密\u H
类AES_加密
{
私人:
静态常数8_t S_盒[256];
静态常数8_t R_CON[11];
uint8_t state[4][4];
无符号短整数加密模式;
无符号短整数;
无符号短int-Nk;
公众:
AES_加密(无符号短整数);
静态uint8_t获取_SBOX_值(uint8_t);
静态uint8_t HEX01xARG(uint8_t);
静态uint8_t HEX02xARG(uint8_t);
静态uint8_t HEX03xARG(uint8_t);
人口无效(uint8_t*);
无效传输密文(uint8_t*);
void子字节();
void shiftRows();
void mixColumns();
空键扩展(常数uint8_t*,uint8_t*);/*分离螺纹*/
void addRoundKey(uint8_t*,int);
};
#endif//AES\u加密\u H
h2:

\ifndef AES\u解密\u H
#定义AES\u解密\u H
类AES_解密
{
公众:
AES_解密();
uint8\u t x;//此行出错:uint8\u t未命名类型;这将在包含时解析
受保护的:
私人:
};
#恩迪夫

在C++中,当你包含一个头时,它就相当于简单地将头的源复制/粘贴到包含它的文件中。p>

例如,考虑以下文件:

somefunction.h:

int some_function();
somefunction.cpp:

#include "somefunction.h"

void some_function(){ return 1+1; }
编译时,编译器(或者更具体地说,预处理器)要做的第一件事就是将somefunction.cpp转换为以下内容:

int some_function();

void some_function{ return 1+1; }
如您所见,somefunction.h的内容被嵌入到somefunction.cpp中

现在,把这个问题与你的问题联系起来,我怀疑你在哪里包括h1.h,它看起来像这样:

#include <iostream>
#include "h1.h"
#包括
#包括“h1.h”
因为h1.h的内容只是嵌入到带有include指令的源文件中,在iostream的include指令之后,它本身可能包含stdint.hü,所以stdint.h中的名称可供h1.h的代码使用。如果,在包含h2.h的地方,您没有首先包含stdint.h,那么您将收到您声称的错误

  • 需要注意的是,这里以iostream为例。我不知道iostream是否包含stdint.h。在不同的标准库实现之间,它是否会有所不同

  • 在C++中,当包含头时,它相当于简单地将头的源复制/粘贴到包含它的文件中。p>

    例如,考虑以下文件:

    somefunction.h:

    int some_function();
    
    somefunction.cpp:

    #include "somefunction.h"
    
    void some_function(){ return 1+1; }
    
    编译时,编译器(或者更具体地说,预处理器)要做的第一件事就是将somefunction.cpp转换为以下内容:

    int some_function();
    
    void some_function{ return 1+1; }
    
    如您所见,somefunction.h的内容被嵌入到somefunction.cpp中

    现在,把这个问题与你的问题联系起来,我怀疑你在哪里包括h1.h,它看起来像这样:

    #include <iostream>
    #include "h1.h"
    
    #包括
    #包括“h1.h”
    
    因为h1.h的内容只是嵌入到带有include指令的源文件中,在iostream的include指令之后,它本身可能包含stdint.hü,所以stdint.h中的名称可供h1.h的代码使用。如果,在包含h2.h的地方,您没有首先包含stdint.h,那么您将收到您声称的错误

  • 需要注意的是,这里以iostream为例。我不知道iostream是否包含stdint.h。在不同的标准库实现之间,它是否会有所不同

  • 可能是h1包含了一些其他标题,而这些标题又定义了uint8\t?请发布您的代码,我不是魔术师。@setia,h1不包含任何其他标题,但什么包含h1,以及它之前包含了什么?@Nilesh包含自己标题的标题是非常常见的。虽然考虑到您正在使用的头文件,stdint.h可能会以这种方式包含在内,但可能性不大。我建议删除该算法。h包含并注释掉任何需要它查看是否出现错误的代码。如果是,那么它会间接确认算法.h包含stdint.h。可能h1包含其他头文件,而这些头文件又定义了uint8\t?请发布您的代码,我不是魔术师。@setia,h1不包含任何其他头文件,但包含h1的是什么,在它之前包含了什么?@Nilesh被包含的标题包含它们自己的标题是非常常见的。虽然考虑到您正在使用的头文件,stdint.h可能会以这种方式包含在内,但可能性不大。我建议删除该算法。h包含并注释掉任何需要它查看是否出现错误的代码。如果是这样,那么它就间接地确认了算法.h包括stdint.h。实际上,到目前为止,我只是在创建heades和.cpp s,它们还没有被测试,所以我认为这可能不是事实。实际上,到目前为止,我只是在创建heades和.cpp s,它们还没有被测试,所以我认为情况可能不是这样