先上源码
//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"...);