1、续行符问题
关于换行符 ,代码在使用了换行符后无法编译文件,也没有爆出任何错误,更没有按照我们的代码打印出如下类似内容
:[ERROR][compiler.hpp][66][1732635247]编译失败,没有形成可执行程序
随机排查才发现。
代码中的 \
是 续行符,用于在 C/C++ 源代码中将一行代码拆分为多行。其主要作用是告诉编译器:“当前行还没有结束,下一行是它的继续”。如果滥用或误用续行符,可能会导致代码行为异常。
删除\后又出现:
[LHL@VM-8-7-centos compile_server]$ ./compile_server
申请的进程PID:28530
申请的进程PID:0
[DEBUG][compiler.hpp][67][1732671807]./tempcode.cpp
[ERROR][compiler.hpp][68][1732671807]编译失败,没有形成可执行程序
问题,重新使用\符号,并清除后面的空格后正常。
为什么去掉 \
后程序正常?
在你的代码中:
execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(),\PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr /*不要忘记nullptr结尾*/);
\
的作用是将代码分成两行,逻辑上视为一整行。- 如果
execlp
的参数列表已经完整,则使用\
并不必要。 - 如果后面的行存在多余的空格或不可见字符,
execlp
的行为可能会受到影响,导致编译器或运行时处理异常。
去掉 \
后代码变为:
execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(), PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr /*不要忘记nullptr结尾*/);
这种情况下,每个参数显式地分开,且没有多余的续行逻辑,编译器直接处理整个语句,不会因隐藏字符问题导致错误。
续行符可能引发的问题
-
隐藏的空格或不可见字符:
如果\
后有空格或 Tab,续行符会失效,导致编译器视后续部分为单独一行。例如:execlp("g++", "g++", "-o", PathUtil::Exe(file_name).c_str(),\ PathUtil::Src(file_name).c_str(), "-std=c++11", nullptr);
上面代码中,
\
后的空格会导致下一行被独立解析,参数传递失败。 -
滥用续行符破坏代码可读性:
使用过多的续行符会让代码变得复杂和难以维护。如果一行代码不长,尽量不要用\
。 -
难以调试:
如果execlp
出现问题,比如执行失败,错误日志可能无法正确定位问题原因。
- 续行符
\
是为分割长行代码而设计的,去掉它让代码写成单行,有助于避免隐藏字符等潜在问题。 - 如果保留续行符,需严格检查后续行是否有多余字符。
- 优化日志记录以便于调试参数错误。
2、umask问题
启动http服务后浏览器无法访问的问题
启动服务端后,在网页中并无法访问服务器端口,经排查原因如下:
检查云平台的安全组规则: 确保在云平台(如阿里云、AWS、腾讯云等)控制台中,安全组规则允许 8080 端口的流量通过。你需要为服务器的公网 IP(49.232.209.35)开放 TCP 端口 8080。
在云平台的控制台中,找到相应的安全组,确保添加了允许来自 任何地方(0.0.0.0/0) 或特定 IP 地址的 8080 端口 TCP 流量。
如上如所示添加相关项即可。
#include "compiler.hpp"
#include "runner.hpp"
#include "compile_run.hpp"
#include "../comm/httplib.h"using namespace ns_complier;
using namespace ns_runner;
using namespace ns_compile_and_run;
using namespace httplib;/*编译服务随时可能被多个人请求,必须保证传递上来的code,
形成的源文件名称具有唯一性,否则多用户之间会相互影响
*/
int main()
{//提供的编译服务,打包形成一个网络服务//cpp-httplibServer svr;svr.Get("/hello",[](const Request &req,Response &resp){resp.set_content("hello httplib,你好 httplib!","content-type: text/plain;charset=utf-8");});svr.listen("0.0.0.0",8080); //启动http服务return 0;