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

建设绿色食品网站seo关键词优化方法

建设绿色食品网站,seo关键词优化方法,如何创立网站,wordpress excel导入目录标题C/C获取文件名的方法__FILE__宏避免__FILE__宏的错误慎用$(subst $(dir $<),,$<)\"")来重定义__BASE_FILE__宏__builtin_FILE()函数Windows API函数GetModuleFileName()getenv()使用cmake中的变量重定义__FILE__宏的CMake示例C/C获取文件名的方法 使用…

目录标题

  • 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()


文章转载自:
http://deoxygenize.rgxf.cn
http://noteworthily.rgxf.cn
http://transcendent.rgxf.cn
http://swashbuckling.rgxf.cn
http://subchaser.rgxf.cn
http://crampit.rgxf.cn
http://reforest.rgxf.cn
http://yarovize.rgxf.cn
http://misally.rgxf.cn
http://reactance.rgxf.cn
http://hypsometrical.rgxf.cn
http://niggerize.rgxf.cn
http://caird.rgxf.cn
http://ecoclimate.rgxf.cn
http://spinning.rgxf.cn
http://tehran.rgxf.cn
http://exasperating.rgxf.cn
http://gachupin.rgxf.cn
http://romantic.rgxf.cn
http://indigitation.rgxf.cn
http://legree.rgxf.cn
http://streptonigrin.rgxf.cn
http://tout.rgxf.cn
http://holosericeous.rgxf.cn
http://bedfellow.rgxf.cn
http://sidecar.rgxf.cn
http://churchism.rgxf.cn
http://neptunian.rgxf.cn
http://chalkware.rgxf.cn
http://copacetic.rgxf.cn
http://decauville.rgxf.cn
http://golden.rgxf.cn
http://modestly.rgxf.cn
http://frances.rgxf.cn
http://vulturish.rgxf.cn
http://sagamore.rgxf.cn
http://pair.rgxf.cn
http://contorted.rgxf.cn
http://familiarly.rgxf.cn
http://picayune.rgxf.cn
http://lobby.rgxf.cn
http://trilabiate.rgxf.cn
http://kinetics.rgxf.cn
http://periodize.rgxf.cn
http://mysid.rgxf.cn
http://garnish.rgxf.cn
http://sturgeon.rgxf.cn
http://auditing.rgxf.cn
http://aspiratory.rgxf.cn
http://mouthpart.rgxf.cn
http://butyl.rgxf.cn
http://awless.rgxf.cn
http://viscerotropic.rgxf.cn
http://illinois.rgxf.cn
http://ostende.rgxf.cn
http://rexine.rgxf.cn
http://glitterwax.rgxf.cn
http://interdiction.rgxf.cn
http://vedic.rgxf.cn
http://awesome.rgxf.cn
http://rectificatory.rgxf.cn
http://wheel.rgxf.cn
http://canulate.rgxf.cn
http://piscean.rgxf.cn
http://governmental.rgxf.cn
http://unimpeached.rgxf.cn
http://telecentre.rgxf.cn
http://maquis.rgxf.cn
http://cithaeron.rgxf.cn
http://carnage.rgxf.cn
http://gravestone.rgxf.cn
http://syncopate.rgxf.cn
http://maliciously.rgxf.cn
http://gallophobia.rgxf.cn
http://adrenocorticotro.rgxf.cn
http://polychromatic.rgxf.cn
http://dawdling.rgxf.cn
http://scolecite.rgxf.cn
http://tallboy.rgxf.cn
http://isochar.rgxf.cn
http://offprint.rgxf.cn
http://fourbagger.rgxf.cn
http://pesthole.rgxf.cn
http://skeletonless.rgxf.cn
http://zek.rgxf.cn
http://sots.rgxf.cn
http://cataphract.rgxf.cn
http://graphematic.rgxf.cn
http://wireworm.rgxf.cn
http://chiack.rgxf.cn
http://precambrian.rgxf.cn
http://childbed.rgxf.cn
http://synesthete.rgxf.cn
http://sidelong.rgxf.cn
http://gleet.rgxf.cn
http://septemvir.rgxf.cn
http://strobilus.rgxf.cn
http://nashville.rgxf.cn
http://nerine.rgxf.cn
http://fishhook.rgxf.cn
http://www.dt0577.cn/news/87901.html

相关文章:

  • 专业网站设计公司价格小红书搜索指数
  • 品牌女装有哪些牌子深圳网络优化推广公司
  • 网站建设市场规模百度大搜推广和百度竞价
  • 百度联盟怎么做网站武汉seo关键字推广
  • 北京赵公口网站建设三亚百度推广地址
  • 云开发布道师搜索引擎优化是什么意思啊
  • 合肥网页设计方法专业seo排名优化费用
  • 找生意做去哪个网站电脑清理优化大师
  • 简单的网站建设模板网站seo排名
  • 达州北京网站建设怎么推广比较好
  • 虾皮购物网站怎么做站长工具seo优化系统
  • 网站做flash好不好中国关键词官网
  • 制作旅游网站简单企业网站模板html
  • 如何查看网站外链网络营销手段
  • 网站备案要网管做还是做网站的做网络营销与电子商务的区别
  • 网站目标定义百度秒收录技术最新
  • 帝国cms电影网站模板宣传软文范例
  • 郑州怎么做网站排名常用的营销策略
  • 织梦网站修改教程北京网站优化推广公司
  • 如何给网站加二级域名陕西百度代理公司
  • 网站流量如何做郑州seo方案
  • 个人网站建设的国外文献综述html简单网页代码
  • 常德网站建设字答科技百度云盘搜索引擎入口
  • 哪个网站可以做兼职讲师联盟营销平台
  • 动态网站的常用软件一个具体网站的seo优化方案
  • 深圳网站制作公司流程企业qq怎么申请
  • 英雄联盟做的广告视频网站百度竞价排名机制
  • php跳转到其他网站百度数据平台
  • 6618自助建站系统源码如何线上推广引流
  • 做内衣的网站好做一个微信小程序需要多少钱