CLion环境下C++自定义print函数报未在作用域声明编译错误
问题原因
这个错误和CLion IDE异常无关,是C语法规则导致的。
C编译遵循从上到下的扫描规则:函数在被调用前,必须已经出现过对应的声明或者完整定义,编译器不会主动向后查找在调用点之后才写的函数实现。
你遇到println能正常运行、只有print报错的情况,是之前触发CLion自动生成函数时,IDE在main函数前自动生成了println的前置声明,你后续删除自动生成的函数实现时,没有删掉这行前置声明,所以编译器能识别println调用;而print从未在调用点前被声明过,编译器找不到它的定义,才抛出"not declared in this scope"的错误。
另外你的代码还存在两处会触发编译错误的问题:
- 代码开头没有引入
<iostream>头文件,std::cout和std::endl本身就属于这个头文件的内容,不引入会报标准库对象未定义的错误 main函数中print("Physics")、print("Prodigy")两行末尾缺少语句结束的分号
修复方案
两种方案任选其一即可:
- 补全头文件引入和函数前置声明,调整后的完整可运行代码如下:
#include <iostream> // 函数前置声明,放在调用点之前 void print(const char *string); void println(const char *string); int main(){ //This is a comment /* This is a multilined Comment std::cout << is like a print() statement in java std::cout << sometihng << std::endl; is something like println() Also don't nest comments... Its gonna cause errors */ std::cout << "Hello World!: " << std::endl; println("My name is: "); print("Physics"); // 补全末尾分号 print("Prodigy"); // 补全末尾分号 return 0; } void print(const char *string){ std::cout << string; } void println(const char *string){ std::cout << string << std::endl; }
- 直接把
print、println两个函数的完整实现挪到main函数之前,这样不需要额外写前置声明,编译器在处理main内的调用时已经见过函数的完整定义。
你可以先检查main函数上方的代码区域,找到残留的println前置声明删掉,就会发现println也会抛出同样的未声明错误,可以验证上述结论。
内容的提问来源于stack exchange,提问作者PhysicsProdigy
相关产品推荐
相关产品推荐

