当前位置: 首页 > news >正文

C/C++获取文件名的方法(__FILE__,__builtin_FILE(),__BASE_FILE__)

目录标题

  • C/C++获取文件名的方法
  • __FILE__宏
    • 避免__FILE__宏的错误
    • 慎用`$(subst $(dir $<),,$<)\"'")`来重定义
  • __BASE_FILE__宏
  • __builtin_FILE()函数
  • Windows API函数GetModuleFileName()
  • getenv()
  • 使用cmake中的变量重定义__FILE__宏的CMake示例


C/C++获取文件名的方法

  • 使用__FILE__

可以获取当前源码文件的文件名

  • 使用__builtin_FILE()函数

__builtin_FILE()是一个内建函数,不同于__FILE__是一个预定义宏,因此__builtin_FILE()的效率可能更高。

  • 使用__BASE_FILE__

与__FILE__宏和__builtin_FILE()函数功能类似,它只包含当前编译单元的文件名,不包含任何路径信息(理论上是这样,实际往往跟__FILE__内容一致)。

  • 使用__PRETTY_FUNCTION__

__func__宏可以获取当前函数名,而__PRETTY_FUNCTION__宏可以获取当前函数的带有参数和返回类型的完整签名,其中包含了源码文件路径。

  • 使用标准库中的getenv函数获取pwd路径

pwd 大家都懂。

  • Windows API函数GetModuleFileName()

使用Windows API函数GetModuleFileName()可以获取当前程序的完整路径

  • 编译时,譬如在cmake中获取文件名,并声明宏

编译时必然要获取所有源文件,这时候用这些文件名定义一个宏即可。


__FILE__宏

近年来,C/C++标准中的__FILE__宏定义引起了广泛关注。该宏定义可用于获取当前程序的文件路径,但是它也有一些限制和风险。
首先,让我们来看看__FILE__宏定义的定义和用法。__FILE__宏定义的作用是返回当前源文件的名称,这个名称可以在命令行或环境变量中设置。例如,假设你在C语言中编写了一个文件读取函数readFile,并且在代码中定义了myfile.c作为目标文件名,那么你可以使用以下代码获取当前文件的名称:

#include <stdio.h>   int main() {  printf("Current file name: %s\n", __FILE__);  return 0;  
} 

然而,由于该宏定义只能返回当前源文件的名称,因此在某些情况下可能会导致问题。例如,如果你正在使用共享库或第三方库,而这些库或库中使用了与原始文件不同的文件名,那么__FILE__宏定义就无法正确地获取到库或库中使用的文件名。此外,即使在单线程环境下,__FILE__宏定义也不是一个安全的选项,因为它允许攻击者获取到当前程序的完整文件名。
因此,虽然__FILE__宏定义非常有用,但我们需要考虑它的安全性和限制。在实际应用中,我们可以通过使用更加安全的文件操作函数来替换__FILE__宏定义。例如,在Windows系统中,你可以使用资源管理器来读取和写入文件,而不需要使用预处理器指令。在Linux系统中,你可以使用进程空间的文件访问权限来达到类似的效果。
接下来,让我们分析一下__FILE__宏定义存在的风险和限制。首先,__FILE__宏定义只能返回当前源文件的名称,因此在某些情况下可能会导致问题。例如,如果你正在使用共享库或第三方库,而这些库或库中使用了与原始文件不同的文件名,那么__FILE__宏定义就无法正确地获取到库或库中使用的文件名。此外,即使在单线程环境下,__FILE__宏定义也不是一个安全的选项,因为它允许攻击者获取到当前程序的完整文件名。
其次,__FILE__宏定义还有一些局限性,它并不能正确地返回当前程序的真正文件路径。事实上,计算机文件系统的逻辑结构是非常复杂的,它由多个层次组成。例如,根目录下的子目录结构、父目录结构等都会影响到文件的真正路径。因此,__FILE__宏定义并不能准确地反映出文件的路径。


  • 避免__FILE__宏的错误

FILE 宏返回的是绝对路径的名称,但是在很多时候我们只需要获取文件名即可,而不需要那一长段繁琐的目录前缀,这时候我们需要对__FILE__宏重定义,当然这只是在不得不用__FILE__宏的情况,如果不是这样,你完全可以用其他方式。
避免__FILE__宏被重定向到错误的文件,我们可以按照以下建议进行操作:

如果使用的是CMake 3.14及以上版本,可以使用CMAKE_CURRENT_LIST_FILE变量来获取当前正在处理的CMake列表文件的完整路径,而不是使用__FILE__宏。

  • 如果您的项目中使用了多个CMake文件,可以在每个文件中使用不同的宏定义来避免重复定义__FILE__宏。,需要仔细检查您的代码和CMake文件,并确保它们是正确的,并使用适当的宏定义和变量来获取文件路径。

  • 慎用$(subst $(dir $<),,$<)\"'")来重定义

这个语法是GNU make中的函数subst的使用,用于将字符串中的某个子串替换为另一个字符串。
在 Makefile 中,$< 表示当前规则中的第一个依赖文件,$(dir $<) 表示 $< 的目录部分,$(subst OLD,NEW,TEXT) 表示将 TEXT 中的 OLD 字符串替换为 NEW 字符串。
因此,$(subst $(dir <),,<),,<),,<) 表示将 $< 中的目录部分替换为空,即只保留文件名部分。
例如,如果当前规则中的第一个依赖文件是 src/foo/bar.c,那么$(dir $<)的值为 src/foo/,$(subst $(dir $<),,$<) 的值就是 bar.c。然后,“'”) 表示在文件名后添加一个双引号和单引号,以便将文件名传递给编译器。


在cmake工程中set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -U__FILE__ -D__FILE__='\"$(subst $(dir $<),,$<)\"'")这个命令告诉编译器不要定义__FILE__宏,而是在后面使用-D__FILE__='“$(subst $(dir <),,<),,<),,<)”'选项重新定义__FILE__宏,将其重定向到输入文件的相对路径。
依赖文件名并不一定意味着源文件名,有时候会被指定为编译器依赖项文件名。
这时候我们的__FILE__就会得不到正确的文件名,而且重定向到错误的中间文件名上,比如compiler_depend.ts文件,有关此文件的介绍可以查看:Cmake 中 compiler_depend.ts文件


__BASE_FILE__宏

如果您使用的是GCC编译器,可以使用__BASE_FILE__宏来获取当前源文件的路径,而不是使用__FILE__宏。该宏在GCC 4.3及以上版本中可用。
__BASE_FILE__宏包含文件名,但不包含文件路径。但是,如果你在源代码中包含了文件路径,那么__BASE_FILE__宏的值将包含路径。这是由于__BASE_FILE__宏的值是在预处理阶段计算的,此时源代码中包含的文件路径已经被展开了。
例如,假设你的源代码文件位于/path/to/source目录下,且包含以下行:
#include "file.h"
在预处理阶段,这行代码将被展开为:
#include "/path/to/source/file.h"
因此,在这种情况下,__BASE_FILE__宏的值将是file.h,但包含路径/path/to/source`。


__builtin_FILE()函数

__builtin_FILE()函数确实是GCC内置函数之一,但是其具体实现并不是源代码形式的,而是由GCC编译器自带的。因此,我们无法提供其具体源代码的定义。__builtin_FILE()函数的实现方式可能随着GCC版本的更新而发生变化,因此无法确切地给出其源代码的定义。
__builtin_FILE()函数的作用是获取当前文件的文件名,它是由编译器自动实现的。在使用该函数时,只需要在代码中调用__builtin_FILE()函数即可,无需手动编写该函数的源代码。由于是内建函数,可以被编译器优化,理论上比__FILE__宏效率更高。
重定义时要指定参数set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin")


Windows API函数GetModuleFileName()

GetModuleFileName()是Windows API函数之一,用于获取指定模块的文件名,包括路径和文件名。该函数提供了一种方法,可以在运行时获取当前可执行文件的路径和文件名。

DWORD GetModuleFileName(HMODULE hModule,LPSTR   lpFilename,DWORD   nSize
);

其中,hModule参数指定要获取路径和文件名的模块的句柄。如果该参数为NULL,则GetModuleFileName()函数将返回调用它的可执行文件的路径和文件名。
lpFilename参数是指向一个缓冲区的指针,用于接收路径和文件名。该缓冲区必须足够大,以至于可以容纳完整的路径和文件名。如果函数成功执行,lpFilename将包含路径和文件名。
nSize参数指定缓冲区的大小,以字节为单位。如果lpFilename缓冲区的大小小于路径和文件名的长度,函数将无法成功执行,并返回0。
GetModuleFileName()函数返回值表示复制到缓冲区的字符数,不包括结尾的空字符。如果函数执行失败,返回值为0。
使用GetModuleFileName()函数,我们可以在运行时获取当前可执行文件的路径和文件名,并将其存储到缓冲区中。例如:

 #include <windows.h>#include <stdio.h>int main() {char path[MAX_PATH];GetModuleFileName(NULL, path, MAX_PATH);printf("The current file is: %s\n", path);return 0;}

getenv()

使用getenv函数即可,没必要使用system之类执行shell命令的函数。
getenv() 函数的返回值是一个指向环境变量值的字符串指针,可以将其用于后续的操作,例如打印、比较等等。而 system() 函数的返回值是执行命令的状态码,用于判断命令是否执行成功。
getenv() 函数在获取环境变量时不会对系统进行任何修改,只是返回变量的值。而 system() 函数会执行指定的系统命令,可能会对系统进行修改,例如创建、删除文件等等。

#include <iostream>
#include <cstdlib>int main() {const char* filename = std::getenv("PWD"); //获取当前工作目录std::cout << filename << std::endl;return 0;
} 

使用cmake中的变量重定义__FILE__宏的CMake示例

  • 根目录遍历子目录情况一:如果源文件在多个目录下,比如src和lib
# 遍历 src 目录下的源文件 file(GLOB_RECURSE SRC_FILES_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cxx"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc"
"${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")# 遍历 lib 目录下的源文件 file(GLOB_RECURSE SRC_FILES_LIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/*.cxx"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/*.cc"
"${CMAKE_CURRENT_SOURCE_DIR}/lib/*.c")# 合并源文件列表 set(SRC_FILES ${SRC_FILES_SRC} ${SRC_FILES_LIB})# 添加源文件到项目中 foreach(SRC_FILE ${SRC_FILES})# 获取相对路径和文件名file(RELATIVE_PATH FILE_REL_PATH ${CMAKE_CURRENT_SOURCE_DIR} ${SRC_FILE})string(REPLACE ${CMAKE_CURRENT_SOURCE_DIR}/ "" MY_FILE_NAME ${FILE_REL_PATH})# 设置源文件的宏定义set_source_files_properties(${SRC_FILE} PROPERTIES COMPILE_DEFINITIONS "__FILE__=\\\"${MY_FILE_NAME}\\\"")# 添加源文件到项目中add_executable(my_project ${SRC_FILE}) endforeach()

  • 根目录遍历子目录情况二:如果每个目录都有可执行文件要生成
file(GLOB_RECURSE
SRC_FILES_SRC1"${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cxx"
"${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cc"
"${CMAKE_CURRENT_SOURCE_DIR}/libs/*.c" "libs/subdir1/*.cpp"
"libs/subdir1/*.cxx" "libs/subdir1/*.cc" "libs/subdir1/*.c"
"libs/subdir2/*.cpp" "libs/subdir2/*.cxx" "libs/subdir2/*.cc"
"libs/subdir2/*.c") 
foreach(SRC_FILE ${SRC_FILES_SRC1})# 获取相对路径和文件名file(RELATIVE_PATH FILE_REL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src1 ${SRC_FILE})string(REPLACE "src1/" "" MY_FILE_NAME ${FILE_REL_PATH})# 设置源文件的宏定义set_source_files_properties(${SRC_FILE} PROPERTIES COMPILE_DEFINITIONS "__FILE__=\\\"${MY_FILE_NAME}\\\"") 
endforeach()add_executable(executable1) target_sources(executable1 PRIVATE ${SRC_FILES_SRC1})
  • 最简单的方式:遍历源文件获取名称并重定义__FILE__宏
#遍历源码文件获取文件名逐以重定义宏
foreach(source ${USR_SOURCES})   get_filename_component(file_name ${source} NAME)   set_source_files_properties(${source} PROPERTIES COMPILE_DEFINITIONS"FILE_NAME=\"${file_name}\";__FILE__=FILE_NAME")  
endforeach()

相关文章:

C/C++获取文件名的方法(__FILE__,__builtin_FILE(),__BASE_FILE__)

目录标题C/C获取文件名的方法__FILE__宏避免__FILE__宏的错误慎用$(subst $(dir $<),,$<)\"")来重定义__BASE_FILE__宏__builtin_FILE()函数Windows API函数GetModuleFileName()getenv()使用cmake中的变量重定义__FILE__宏的CMake示例C/C获取文件名的方法 使用…...

线程池的讲解和实现

&#x1f680;&#x1f680;&#x1f680;&#x1f680;&#x1f680;&#x1f680;&#x1f680;大家好,今天为大家带来线程池相关知识的讲解,并且实现一个线程池 &#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;…...

linux编程──gcc和clang

实验链接 编译原理实验-GCC/Clang工具链在ARM架构上的使用 实验报告 第1关&#xff1a;理解程序的不同表示形式 ##问题1-1&#xff1a; 如果在命令行下执行 gcc -DNEG -E sample.c -o sample.i生成的sample.i 与之前的有何区别&#xff1f; 根据定义NEG,而选择了M定义为-4…...

字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。最近面试字…...

5.多线程学习

作者&#xff1a;爱塔居 专栏&#xff1a;JavaEE 作者简介&#xff1a;大三学生&#xff0c;喜欢总结与分享~ 文章目录 目录 文章目录 章节回顾 一、wait 和notify 二、设计模式 2.1 单例模式 章节回顾 线程安全 1.一个线程不安全的案例&#xff08;两个线程各自自增5w次&…...

数据结构中的堆

一、树的重要知识点 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff08;有几个孩子&#xff09;叶节点或终端节点:度为0的节点称为叶节点&#xff1b;如上图&#xff1a;B、C、H、I...等节点为叶节点&#xff08;0个孩子&#xff09;非终端节点或分支节点…...

Linux内核设备信息集合

本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合&#xff0c;就是根据不同的外设寻找各自的外设信息&#xff0c;我们知道一个完整的开发板有 CPU 和各种控制器&#xff08;如 I2C 控制器、SPI 控制器、DMA 控制器等&#xff09;&#xff0…...

若依框架---权限管理设计

前言 若依权限管理包含两个部分&#xff1a;菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称&#xff0c;可以细分为目录、菜单和按钮&#xff0c;以若依自身为例&#xff1a; 目录&#xff0c;就是页…...

Java设计模式(二)——工厂模式

当用户需要一个类的子类实例&#xff0c;且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时&#xff0c;可采用工厂模式&#xff1b;当用户需要系统提供多个对象&#xff0c;且希望和创建对象的类解耦时&#xff0c;可采用抽象工厂模式。 工厂模式一般分为简单工厂、…...

【Maven】

MavenMaven简介仓库坐标Maven项目构建依赖管理生命周期及插件插件模块拆分与开发聚合继承属性版本管理资源配置多环境开发配置跳过测试私服Maven简介 Maven的本质时一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型(POM) POM(Project Object Model)&a…...

[JAVA]继承

目录 1.继承的概念 2.继承的语法 3.父类成员访问 3.1子类中访问父类成员变量 3.2子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.继承方式 7.final关键字和类的关系 面向对象思想中提出了继承的概念&#xff0c;专门用来进行共性抽取&#xff0c;实现代码复…...

Vue3 pinia持久化存储(组合式Api案例演示)

pinia-plugin-persist&#xff08; pinia持久化插件&#xff09; 本文采用的是 组合式Api的方式来做Pinia的持久化存储演示 如果对pinia的持久化还是不是很了解的&#x1f468;‍&#x1f393;&#xff5c;&#x1f469;‍&#x1f393;&#xff0c;可以看一下笔者的上一篇文章…...

8个你一看就觉得很棒的Vue开发技巧

1.路由参数解耦 通常在组件中使用路由参数&#xff0c;大多数人会做以下事情。 export default {methods: {getParamsId() {return this.$route.params.id}} }在组件中使用 $route 会导致与其相应路由的高度耦合&#xff0c;通过将其限制为某些 URL 来限制组件的灵活性。 正…...

vue3+ts 开发效率提升

1、vite pnpm项目初始化 pnpm&#xff1a; 比npm或yarn快10倍 pnpm与其他包管理器&#xff08;如npm和Yarn&#xff09;的不同之处在于它使用一种称为“硬链接”的独特安装方法。当你使用PNPM安装一个包时&#xff0c;它并不会将包的文件复制到每个项目的node_modules目录中&a…...

【数据结构与算法】队列和栈的相互实现以及循环队列

目录&#x1f314;一.用队列实现栈&#x1f319;1.题目描述&#x1f319;2.思路分析&#x1f319;3.代码实现⛈二.用栈实现队列☔1.题目描述☔2.思路分析☔3.代码实现&#x1f308;三.实现循环队列&#x1f314;一.用队列实现栈 &#x1f319;1.题目描述 我们先看一下题目链接…...

mysql连接不上问题解决

公司新搭内网测试环境&#xff0c;mysql远程登录问题解决 远程登录: 1 修改host, mysql> select user,host,plugin from user; ---------------------------------------------------- | user | host | plugin | ------------------------…...

利用nginx实现动静分离的负载均衡集群实战

前言 大家好&#xff0c;我是沐风晓月&#xff0c;今天我们利用nginx来作为负载&#xff0c;实现两台apache服务器的动静分离集群实战&#xff1b; 本文收录于沐风晓月的专栏《linux基本功-系统服务实战》&#xff0c;更多内容可以关注我的博客&#xff1a; https://blog.csd…...

与chatGPT神聊,引领你深入浅出系统调用

在操作系统的教学中&#xff0c;系统调用的作用不言而喻&#xff0c;但是&#xff0c;对系统调用常常是雾里看花&#xff0c;似乎明白&#xff0c;又难以真正的触及&#xff0c;即使在代码中调用了系统调用&#xff0c;比如调用fork&#xff08;&#xff09;创建进程&#xff0…...

自学大数据第十天~Hbase

随着数据量的增多,数据的类型也不像原来那样都是结构化数据,还有非结构化数据; Hbase时google 的bigtable的开源实现, BigtableHbase文件存储系统GFSHDFS海量数据处理MRMR协同管理服务chubbyzookeeper虽然有了HDFS和MR,但是对于数据的实时处理是比较困难的,没有办法应对数据的…...

vue更高效的工具-vite

目录 1.webpack 2.vite是什么 3.使用vite创建项目 4.最后总结 &#x1f43c;webpack 简单来说&#xff0c;Webpack是一个打包工具。 站在2018年的角度&#xff0c;成为一个优秀的前端工程师&#xff0c;除了要会写页面样式和动态效果之外&#xff0c;还需要会用主流的单页…...

HFish蜜罐的介绍和简单测试(一)

目录 0、什么是蜜罐 0.1、蜜罐的定义 0.2、蜜罐的优势 0.3、蜜罐与情报 1、HFish介绍 1.1、设计理念 1.2、HFish架构 1.3、HFish特点 1.4、常见蜜罐场景 2、快速部署 2.1、环境要求 2.2、联网环境&#xff0c;一键安装 2.3、安装效果 3、错误排查 3.1、管理端问题…...

2023面试题汇总二

一、CSS面试题 1. 清除浮动的方式有哪些&#xff1f; 为什么要清除浮动&#xff1f;因为浮动的盒子脱离标准流&#xff0c;如果父盒子没有设置高度的话&#xff0c;下面的盒子就会撑上来。 额外标签法(在最后一个浮动标签后&#xff0c;新加一个标签&#xff0c;给其设置cle…...

C# 支付宝接口在线收款退款

收款 在C#中使用支付宝在线支付功能&#xff0c;需要使用支付宝开放平台提供的SDK&#xff08;软件开发工具包&#xff09;&#xff0c;通过SDK中提供的API&#xff08;应用程序接口&#xff09;实现在线支付功能。 以下是使用C#实现支付宝在线支付的大致步骤&#xff1a; 获…...

python例程:《企业编码生成系统》程序

目录《企业编码生成系统》程序使用说明主要代码演示源码及说明文档下载路径《企业编码生成系统》程序使用说明 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需…...

基于EB工具的TC3xx_MCAL配置开发04_ADC模块软件触发Demo配置

目录 1.概述2. EB配置2.1 添加HwUnit2.2 AdcPrescale配置2.3 添加ADC通道2.4 添加Adc Group2.5 Adc Group配置2.5.1 AdcGroup->General2.5.2 AdcGroup->AdcNotification2.5.3 AdcGroup->AdcGroupDefinition2.5.4 AdcGroup->AdcResRegDefinition2.6 中断配置1.概述 …...

内存操作函数

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨未来…...

免费搭建个人博客

免费搭建个人博客,并发布到公网 利用hexo搭建个人博客&#xff0c;通过gitee的pages发布到公网 1 前置准备 安装git、安装node.js&#xff08;尽量选择长期支持的版本) node.js官网&#xff1a;https://nodejs.org/en/ git官网&#xff1a;https://git-scm.com/book/zh/v2 安装…...

【Vue全家桶】详解Vue Router(一)

【Vue全家桶】Vue Router详解&#xff08;一&#xff09; Vue系列文章目录&#xff1a; 内容参考链接Vue&#xff08;一&#xff09;【Vue全家桶】邂逅Vue、Vue的多种引入方式Vue&#xff08;二&#xff09;【Vue全家桶】声明式编程、MVVMVue&#xff08;三&#xff09;【Vue…...

9大 HIVE SQL 最频繁被问到的面试题

SQL是用于数据分析和数据处理的最重要的编程语言之一&#xff0c;因此与数据科学相关的工作&#xff08;例如数据分析师、数据科学家和数据工程师&#xff09;在面试时总会问到关于 SQL 的问题。 SQL面试问题旨在评估应聘者的技术和解决问题的能力。因此对于应聘者来说&#x…...

学大数据算跟风吗?

随着互联网、物联网和人工智能等技术的不断发展&#xff0c;大数据技术逐渐进入人们的视野&#xff0c;成为一个备受关注的热点话题。那么&#xff0c;大数据专业好学吗&#xff1f;前景如何&#xff1f;下面我们来一起探讨一下。 一、大数据专业的学习难度 大数据技术是一种综…...

商务网站建设的一般流程是什么/什么是软文

临近2018年底&#xff0c;我们阿里云上的一台ECS服务器竟然被阿里云短信提示有挖矿程序&#xff0c;多次收到阿里云的短信提醒说什么服务器被植入挖矿程序&#xff0c;造成系统资源大量消耗&#xff1b;而且还收到CPU使用率达到百分之90的安全提醒&#xff0c;我们的服务器上并…...

查看网址/青岛seo霸屏

一个老师拥有多个学生&#xff01;对于老师而言&#xff0c;就是一对多的关系! 学生实体类中老师的属性为tid&#xff0c;老师实体类中包含学生对象&#xff1b; public class Teacher {private int id;private String name;// 一个老师对应多个学生private List<Student&g…...

wordpress 缺少父主题/整站seo排名外包

NEW关注Tech逆向思维视频号最新视频→【最骇人的5起自动驾驶“杀人”事故】来源&#xff5c;大数据文摘文&#xff5c;王烨2020年6月&#xff0c;由于国外疫情严重&#xff0c;国内的女友怀孕&#xff0c;17岁的小陈孤身在国外格外焦虑。雪上加霜的是&#xff0c;尽管小陈非常想…...

企业网站怎样做/免费推广工具

冒泡排序算法将相邻的元素进行两两比较,大的向后”冒”, 小的向前”赶”。口诀: N个数字来排队&#xff0c;两两比较小靠前外层循环N-1(控制需要比较的轮数)。内层循环N-1-i(控制每轮需要比较的次数)。];int i;//循环接收用户输入的元素;iprintf();scanf("%d",&n…...

好享管家安卓下载/hyein seo

八年级数学下册&#xff1a;必考知识点汇总整理&#xff01;非常全面&#xff0c;考试必考内容初二是初中阶段学习的一个关键点&#xff0c;“承上启下”连接着初一和初三&#xff0c;尤其是数学这门学科&#xff0c;在初二的时候学习难度会直线上升&#xff0c;因此如果基础不…...

比较好的wordpress/广告联盟有哪些平台

本方法只适用数据量较少的网站&#xff0c;数据量大的网站请考虑其他可行方案&#xff01;此脚本将向您发送一封电子邮件&#xff0c;附带一个 .sql 文件&#xff0c;从而使您能够轻松地备份特定的表。如果你有一个数据库驱动的网站&#xff0c;你的 MySQL 信息是最有价值的&am…...