草庐IT

c - 在 C 预处理器中避免双重宏替换

这是一个简单的小C程序,让我困惑了一段时间:#include#defineSTR1(x)#x#defineSTR(x)STR1(x)intmain(void){printf("%s\n",STR(MYDEF));}这只是使用标准的字符串化双定义技术将MYDEF#define的值打印为字符串。使用gcc-DMYDEF=abcprog.c编译(在Linux上)运行结果,毫不奇怪,它会打印出“abc”。但是更改值gcc-DMYDEF=linuxprog.c并且打印的结果不是'linux'而是'1'。所以这让我有点困惑,但它当然会发生,因为我发现gcc(在Linux上)有一个内置的#defin

c - 在 C 预处理器中避免双重宏替换

这是一个简单的小C程序,让我困惑了一段时间:#include#defineSTR1(x)#x#defineSTR(x)STR1(x)intmain(void){printf("%s\n",STR(MYDEF));}这只是使用标准的字符串化双定义技术将MYDEF#define的值打印为字符串。使用gcc-DMYDEF=abcprog.c编译(在Linux上)运行结果,毫不奇怪,它会打印出“abc”。但是更改值gcc-DMYDEF=linuxprog.c并且打印的结果不是'linux'而是'1'。所以这让我有点困惑,但它当然会发生,因为我发现gcc(在Linux上)有一个内置的#defin

linux - <命令行> :1:1: error: macro names must be identifiers

我是Linux和makefile的新手。我有一个生成.a文件的makefile。当我运行makefile时,出现以下错误。我不知道错误发生在代码的哪一部分。[oracle@dyl02703app004erm]#make-ferm_make_idaall....Compiling/home/wholesale/children/dev5/comps/erm/obj/ermparseyac.ccc-g-DANSI-D-DTRACE_ON-DIDA_VERSION='"ISP-RG-V5.10.7GEN2A"'-DNO_MCP-DBUILDING_ERP-I/home/wholesale/c

linux - <命令行> :1:1: error: macro names must be identifiers

我是Linux和makefile的新手。我有一个生成.a文件的makefile。当我运行makefile时,出现以下错误。我不知道错误发生在代码的哪一部分。[oracle@dyl02703app004erm]#make-ferm_make_idaall....Compiling/home/wholesale/children/dev5/comps/erm/obj/ermparseyac.ccc-g-DANSI-D-DTRACE_ON-DIDA_VERSION='"ISP-RG-V5.10.7GEN2A"'-DNO_MCP-DBUILDING_ERP-I/home/wholesale/c

c - 预处理后的内核模块源文件

让我们编写以下最简单的模块源文件:#include#includestaticint__initmd_init(void){printk("Hellokernel");return0;}staticvoid__exitmd_exit(void){printk("Goodbyekernel");}module_init(md_init);module_exit(md_exit);如何在预处理后查看此源?我想知道__init和__exit宏是如何部署的以及什么是module_init(md_init)和module_exit(md_exit)?它是如何工作的?

c - 预处理后的内核模块源文件

让我们编写以下最简单的模块源文件:#include#includestaticint__initmd_init(void){printk("Hellokernel");return0;}staticvoid__exitmd_exit(void){printk("Goodbyekernel");}module_init(md_init);module_exit(md_exit);如何在预处理后查看此源?我想知道__init和__exit宏是如何部署的以及什么是module_init(md_init)和module_exit(md_exit)?它是如何工作的?

c - 使用 linux 宏 access_ok() 有什么意义

我一直在做一些研究,我对这个宏有点困惑。希望有人能给我一些指导。我有一些ioctl代码(这是我继承的,而不是编写的),如果在继续从用户空间复制数据之前检查access_ok(),它做的第一件事是:#define__lddk_copy_from_user(a,b,c)copy_from_user(a,b,c)#define__lddk_copy_to_user(a,b,c)copy_to_user(a,b,c)longcan_ioctl(structfile*file,unsignedintcmd,unsignedlongarg){switch(cmd){caseCOMMAND:if(!

c - 使用 linux 宏 access_ok() 有什么意义

我一直在做一些研究,我对这个宏有点困惑。希望有人能给我一些指导。我有一些ioctl代码(这是我继承的,而不是编写的),如果在继续从用户空间复制数据之前检查access_ok(),它做的第一件事是:#define__lddk_copy_from_user(a,b,c)copy_from_user(a,b,c)#define__lddk_copy_to_user(a,b,c)copy_to_user(a,b,c)longcan_ioctl(structfile*file,unsignedintcmd,unsignedlongarg){switch(cmd){caseCOMMAND:if(!

C++预处理器

我使用unix作为变量名重写了一个简单的C++程序。但是程序编译失败。#includeintmain(){intunix=1;return0;}在互联网上搜索了很多之后,我找到了这个网站,它告诉我unix是等于1的预定义宏。我想知道所有此类预定义宏的列表。 最佳答案 您可以使用GNU预处理器cpp列出所有预定义的宏:cpp-dMfile.cpp另请注意,unix、linux等宏是非标准宏,您可以使用-ansi编译标志禁用它们,如下所示:g++-ansifile.cpp您还可以将-ansi标志与cpp一起使用,以获取所有标准预定义宏的

C++预处理器

我使用unix作为变量名重写了一个简单的C++程序。但是程序编译失败。#includeintmain(){intunix=1;return0;}在互联网上搜索了很多之后,我找到了这个网站,它告诉我unix是等于1的预定义宏。我想知道所有此类预定义宏的列表。 最佳答案 您可以使用GNU预处理器cpp列出所有预定义的宏:cpp-dMfile.cpp另请注意,unix、linux等宏是非标准宏,您可以使用-ansi编译标志禁用它们,如下所示:g++-ansifile.cpp您还可以将-ansi标志与cpp一起使用,以获取所有标准预定义宏的