草庐IT

c++ - 在 C++ 中使用#ifndef 和#define 是否过时了?

最近开始学习C++,向一个日常工作用C++的friend请教#ifndef和#define。他说没有人使用,因为如果有人编写了正确的代码,他们就不需要了。然而,在我正在阅读的书籍(对于初学者)中,被告知使用它们是一种很好的做法。 最佳答案 如果您想使用某些特定于操作系统的功能或想为不同的平台编写不同的代码怎么办?如果您希望能够启用/禁用代码的某些功能怎么办?这是预处理器和#ifdef、#define和#endif。假设您希望您的代码使用某些特定于Windows和Linux的功能:#ifdefWINDOWS#include#else#

c++ - 使用#define 进行库配置

我正在开发一个C++数学库,我希望能够在编译时使用定义在其中进行配置。其中一个配置是定义精度。在代码中它看起来像这样:#ifdefMYMATH_USE_DOUBLEtypedefdoubleReal;#elsetypedeffloatReal;#endif这很好。如果有人想在使用MYMATH_USE_DOUBLE配置后使用该库,他们还必须将该定义传递给编译器。有更好的方法吗?我不希望用户必须记住用于编译数学库的定义,然后为他们的应用程序重复这些定义。 最佳答案 我建议使用模板,默认为double。templateFsin(const

C++ 宏有条件地编译代码?

我想根据宏有条件地编译代码。基本上我有一个看起来像的宏(从真实版本简化而来):#ifDEBUG#defineSTART_BLOCK(x)if(DebugVar(#x)\{chardebugBuf[8192];#defineEND_BLOCK()printf("%s\n",debugBuf);}#else#defineSTART_BLOCK(x)(void)0;#defineEND_BLOCK()(void)0;#endif问题是,如果定义了DEBUG,您可以执行以下操作:START_BLOCK(test)charstr[]="Testisdefined";strcpy(debugBuf

c++ - C/C++ 条件宏组合

我可以在为C或C++编写代码时组合宏吗?如果不是,为什么?如果是,如何?我对如何解决以下(不正确且未编译!!!)想法很感兴趣:#defineFREE(x)if((x)){\#ifdefMEM_DEBUG_\fprintf(stderr,"free:%p(%s:%d)\n",(x),__FILE__,__LINE__);\#endif\free((x));}所以,我想要实现的是:我想定义宏FREE,如果我定义了MEM_DEBUG,它将包含一个额外的行。我知道,为了解决这个问题,我可以根据MEM_DEBUG为FREE定义两个定义,例如:#ifdefMEM_DEBUG#defineFREE(

c++ - #error inside of#define - 可能在 C++ 中(如果未定义某些常量,则在调用宏 MyMacro 时生成错误)?

我想定义宏,它基于某些条件(#defineINITED的存在,而不是宏的参数)将返回值,或生成编译器错误,例如:#errorNotinitialized!我试过(对于myIdea.h):#ifdefINITED#defineMyMacro(x)x->method();//somethingwithx#else#defineMyMacro(x)#errorNotinitalized!#endif但是该代码会生成错误(不是我想要的那个)预期的宏格式参数。请注意,我不想要该代码(工作,但做了一些不同的事情):#ifdefINITED#defineMyMacro(x)x->method();/

c++ - 如何编写安全且用户友好的 c/c++ #define 宏

我一直在思考如何编写安全、可读和直观的宏。正确使用它们应该通过它们的外观来理解,如果使用不当,编译器应该告诉你,而不是让你引入一个模糊的错误。在编写多行定义宏时,我通常会发现自己是这样构造它们以满足所需条件的:#definemacro(x)do{\...somecodeline;\...somecodeline;\}while(0)这样你就可以...if(a){macro(a);}和...if(a)macro(a);else{...}一个很好的特性是,如果你不正确地使用它们,你会得到一个编译器错误。这不会编译例如:if(a)macro(a)elseb();但是,我看到SW开发人员阅读了

C++ - 最佳实践#define 只写一次的值?

在我们的代码中,我们需要处理配置,为此我们需要将配置名称作为std::string传递给我们自己的框架。示例代码:framework.handle_config("enable-radio-link")framework.handle_config("enable-tv-link")framework.handle_config("enable-gateway-link")soonto...n这些字符串将只写在一个地方,不会在其他任何地方重复。除了只有2或3个配置。我的队友希望将其作为#define并作为最佳实践使用。喜欢#defineENABLE_RADIO_LINK"enable-

c++ - #include <string> 在 header 中定义了一些结构。错误 : string does not define a type

#ifndefSTRCUTS_H#defineSTRCUTS_H#includestructmenuEntry{stringitemID;//'string'doesnotnameatypestringitemName;//'string'doesnotnameatype};#endif当我将#include放在header保护上方时,我得到了同样的错误。想一想,我以前在将结构定义放在标题中时遇到过奇怪的麻烦。一定是我没有得到的东西。 最佳答案 您需要将string更改为std::string,即#ifndefSTRCUTS_H#d

c++ - 使用宏迭代生成函数声明

我正在尝试使用宏生成函数声明/*goal:generateintf(inta,floatb)*/templatestructptype;templatestructptype{typedefPtype;};#defineNAMEe#defineCOMMAe#defineCOMMA,#defineNAME(N)NPARAMS#definePARAMS(P,...)COMMA##__VA_ARGS__PNAME##__VA_ARGS__#definePARAM_ITER(P)PNAME#definePROTO(R,N,P)\ptype::typeN(PARAM_ITERP(,e))PROT

C++ #define 我的我 ->

我正在查看旧应用程序的源代码。在这段代码中,我看到了很多用法“我的”。它被定义为#definemyme->但我不确定这到底是什么意思。这是否意味着如果我使用“my”,它将使用“this->”?我知道这不是一个好的做法,但我需要了解它的作用。谢谢!编辑:这里是作者的更多信息:/*Usethemacros'I'and'thou'forobjectsintheformalparameterlists(iftheexplicittypecannotbeused).Usethemacros'iam'and'thouart'asthefirstdeclarationinafunctiondefin