草庐IT

c++ - 是否可以在 C++ 的命名空间中放置一个宏?

我的应用程序使用另一个输出而不是标准输出来记录信息,这就是我编写自己的Log()、Error()、Panic()和Assert()函数。为了更好地组织事情,我将所有调试内容都包含在Debug命名空间中。Assert()函数还提供源文件和行号会更有意义,这只能使用__LINE__和__FILE__宏。但是,总是必须指定这两个参数是非常不愉快、低效的等等。这就是我的代码的样子:namespaceDebug{voidAssert(intcondition,std::stringmessage,std::stringfile,intline);}我的问题是,是否可以在Debug命名空间中放置一

c++ - 将此作为参数使用 va_start 宏是否安全?

我必须在嵌入式应用程序中使用IAR编译器(它没有命名空间、异常、多重/虚拟继承、模板有点限制并且仅支持C++03)。我不能使用参数包,所以我尝试使用可变参数创建成员函数。我知道可变参数通常是不安全的。但是在va_start宏中使用this指针是否安全?如果我使用普通的可变参数函数,则在...之前需要一个虚拟参数才能访问剩余的参数。我知道可变参数宏在...之前不需要参数,但我不想使用它。如果我使用成员函数,它在...之前隐藏了this参数,所以我尝试了它。:structVariadicTestBase{virtualvoidDO(...)=0;};structVariadicTest:p

c++ - 如果未定义检查的 bool 宏,则生成错误

我有几个配置文件,每个配置文件都包含一些bool宏的定义,设置为0或1。然后,在我的代码中,我检查这样一个宏的值来决定激活代码的哪一部分。现在是棘手的部分:我想确保包含我的宏定义的header已包含在内。在以下示例中,如果我忘记包含包含FOO定义的头文件,编译器将打印“world!”,而我希望它生成错误。//intheconfigurationheaderfile#defineFOO1//inacppfile#ifFOO//IwouldlikethistogenerateanerrorifIforgottoincludetheheaderfile#pragmamessage"Hello

c++ - 函数名 __func__ 的预定义宏

我正在尝试构建一个调试日志消息函数,用于记录调用日志消息的文件、行和函数。#defineDEBUG_PANIC(p)CLogging::Debuglogf("Debugmarker(%s)-::%s()infile:%s(%d)",p,__func__,__FILE__,__LINE__);上面的代码适用于一些编译器,但不是全部。我的代码需要与GCC以及MicrosoftVisualStudio交叉兼容。我添加了以下定义以帮助兼容性。#ifndef__FUNCTION_NAME__#ifdefined__func__//Undeclared#define__FUNCTION_NAME_

c++ - 是否可以将大括号括起来的初始化程序作为宏参数传递?

我有一个这样调用的函数:literal({1,2});我想写一个扩展为这个语句的宏,例如:MYMACRO(long[2],{1,2})不幸的是,预处理器不知道大括号匹配,因此它会看到三个参数(第二个和第三个分别是{1和2})。这是预处理器的一个已知限制,最简单的解决方案通常是在宏调用中添加额外的括号,如果可能的话。但是,在这种情况下,将大括号括起来的初始化程序放在括号内似乎会改变其含义:literal(({1,2}));(g++4.8)error:leftoperandofcommaoperatorhasnoeffect[-Werror=unused-value]这是GCC错误还是设计

c++ - MSVC++ 可变参数宏扩展

所以我有一个在GCC中运行良好的宏,但在Microsoft的C++编译器中却不行。我希望有人可能知道一种解决方法,或者可以向我解释为什么它会这样。我确信这个宏并不完全是“标准的”,但它确实可以帮助我。这是一个宏的功能示例:#defineVA_NARGS_IMPL(_1,_2,_3,_4,_5,N,...)N#defineVA_NARGS(...)VA_NARGS_IMPL(__VA_ARGS__,5,4,3,2,1)#defineFULLY_EXPANDED(count,...)\MAC##count(__VA_ARGS__)#defineSEMI_EXPANDED(count,...

c++ - 将调用者 __FILE__ __LINE__ 传递给函数而不使用宏

我已经习惯了:classDb{_Commit(char*file,intline){Log("Commitcalledfrom%s:%d",file,line);}};#defineCommit()_Commit(__FILE__,__LINE__)但最大的问题是我在全局范围内重新定义了Commit这个词,而在400k行的应用程序框架中这是一个问题。而且我不想使用像DbCommit这样的特定词:我不喜欢像db->DbCommit()这样的冗余,或者在任何地方手动传递值:db->Commit(__FILE__,__LINE__)最差。那么,有什么建议吗? 最佳

c++ - __FILE__ 编译时的宏操作处理

我在将一些东西从Solaris移植到Linux时遇到的一个问题是Solaris编译器在预处理期间将宏__FILE__扩展为文件名(例如MyFile.cpp),而Linux上的gcc扩展到完整路径(例如/home/user/MyFile.cpp)。这可以使用basename()相当容易地解决,但是....如果您经常使用它,那么所有对basename()的调用都必须加起来,对吗?问题来了。有没有办法使用模板和静态元编程,在编译时运行basename()或类似的?由于__FILE__是常量并且在编译时已知,这可能会使它更容易。你怎么看?能做到吗? 最佳答案

c++ - 为什么 C 宏不是类型安全的?

如果遇到此claimmultipletimes并且无法弄清楚它应该是什么意思。由于生成的代码是使用常规C编译器编译的,因此最终会像任何其他代码一样多(或少)进行类型检查。那么为什么宏不是类型安全的?这似乎是他们应该被视为邪恶的主要原因之一。 最佳答案 考虑典型的“max”宏与函数:#defineMAX(a,b)a当人们说宏在函数的方式上不是类型安全的时,这就是人们的意思:如果函数的调用者写入char*foo=max("abc","def");编译器会发出警告。然而,如果宏的调用者写道:char*foo=MAX("abc","def"

node.js - node.js 是否有像 c++ 预处理器宏这样的 __file__ 和 __line__ 之类的东西?

我正在努力增强某些node.js应用程序的日志记录。过去曾使用C++的__file__和__line__预处理器宏来帮助我们在记录事件时跟踪问题。我在node.js世界中没有发现任何类似的东西。有没有人有建议或知道如何在node.js中获取行号和文件名以用于日志记录?我正在寻找类似的东西:console.log(__FILE__+"."+__LINE__+"\t"+newDate().toISOString()+"Message"); 最佳答案 见globalobject:__filename对于lineNumber,请参阅此帖子: