记录一个编译报错案例"does not name a type"

先上源码

//S3Public.h文件
struct S3Config
{
  std::string key;
  ...
}

// ApiDemo.cpp文件
#include "S3Public.h"
...
S3Config s3cfg;
s3cfg.key = ''KJJKDDFF";
...

int main()
{
  ...
  return 0;
}

编译报错如下:

/home/workspace/0awsPrj/libS3/test/apiTest.cpp:28:1: error: ‘s3cfg’ does not name a type
   28 | s3cfg.key = "99F37DEE15EE4E55B74EC93F9AF1E40D4067";

首先,怀疑是头文件没有包含,反复检查确认没有问题
1、执行命令make VERBOSE=1
查看make详细过程,头文件路径有包含。
2、尝试命令gcc -v
查看gcc预编译的详细过程,头文件路径有。
3、该报错典型问题就是相互包含,但是S3Public.h是个基本声明文件,只依赖<string>。然后各种查阅、尝试无意中发现,将赋值移动到main中,编译通过,代码如下。

//S3Public.h文件
struct S3Config
{
  std::string key;
  ...
}

// ApiDemo.cpp文件
#include "S3Public.h"
...
S3Config s3cfg;
...

int main()
{
  s3cfg.key = ''KJJKDDFF";
  ...
  return 0;
}

突然醒悟:函数体外是在编译、预处理阶段处理的,无法识别变量的类型(也不知道它的地址)。
解决方法:

  • 变量定义的时候初始化,比如增加带参构造;
  • 先定义,变量赋值移到合适的地方执行;

4、写了一个demo验证如下, 确实如此。

#include<stdio.h>
int ttt;
ttt = 12;
int main()
{
  ttt = 13;
  return 0;
}

/home/workspace/0awsPrj/libS3/test/ttt.cpp:3:1: error: ‘ttt’ does not name a type

5、对S3Config类增加一个构造函数,将参数传入构造初始化,编译成功,达到了代码整洁,完结。

S3Config(const std::string& key... )
S3Config s3cfg("99F37DEE15EE40D4067"...);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容