- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我刚刚注意到 __func__
、__FUNCTION__
和 __PRETTY_FUNCTION__
不被视为预处理器宏,并且在16.8 预定义宏名称 标准 (N4527 Working Draft) 部分。
这意味着它们不能用于 phase 6 的字符串连接技巧。 :
// Valid
constexpr char timestamp[]{__FILE__ " has been compiled: " __DATE__ " " __TIME__};
// Not valid!!!
template <typename T>
void die() { throw std::runtime_error{"Error detected in " __PRETTY_FUNCTION__}; }
据我所知,__FILE__
、__DATE__
和 __TIME__
被翻译为标准规定的字符串文字:
16.8 Predefined macro names [cpp.predefined]
__DATE__
The date of translation of the source file: a character string literal of the form
"Mmm dd yyyy"
, where the names of the months are the same as those generated by the asctime function, and the first character of dd is a space character if the value is less than 10. If the date of translation is not available, an implementation-defined valid date shall be supplied.
__FILE__
The presumed name of the current source file (a character string literal).
__TIME__
The time of translation of the source file: a character string literal of the form
"hh:mm:ss"
as in the time generated by the asctime function.
__func__
被标准称为函数局部预定义变量,形式如下:
static const char __func__[] = "function-name ";
所以事实是这是一个局部变量,因此字符串连接技巧不适用于它。
至于 __FUNCTION__
和 __PRETTY_FUNCTION__
并没有在标准中提及(是否定义了实现?)但是认为它们的行为会像 __func__
.
所以问题是:为什么 __func__
、__FUNCTION__
和 __PRETTY_FUNCTION__
是函数局部静态常量数组,而 __FILE__
、__DATE__
和 __TIME__
是字符串文字吗?这个决定背后的理由是什么(如果有的话)?
最佳答案
在预处理时扩展 __func__
要求预处理器知道它正在处理哪个函数。预处理器通常不知道这一点,因为解析发生在预处理器完成之后。
一些实现结合了预处理和解析,在这些实现中,__func__
可以按照您希望的方式工作。事实上,如果我没记错的话,MSVC 的 __FUNCTION__
就是这样工作的。但是,将翻译阶段分开是对实现的不合理要求。
关于c++ - 为什么 __func__、__FUNCTION__ 和 __PRETTY_FUNCTION__ 不是预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430765/
使用: #define DEBUG_FOO(foo) fprintf(stderr, "foo is %x, currently in %s\n", foo, __FUNCTION__); 将打印:
我正在尝试添加一个编译局部变量的 c 宏它被初始化为函数名.. 例如。 void foo (void) { stubmacro; } void bar (void) { stubmacr
__FUNCTION__ 不是字符串文字吗?我一直认为它是 - 沿着 __FILE__ 的路线,但我刚刚发现我不能将字符串文字相邻地连接到它。如果它不是字符串文字,它被定义为什么?我无法让 cscop
如果我问的是一个明显的问题,请原谅我,但是在经历了一堆线程并尝试了一些东西之后,我无法确定这个简单的事情。 我有这个小程序: #define FUNC_PREFIX __FUNCTION__ "()
是否有像 __FUNCTION__ 或 __func__ 这样的编译时常量,其中还包括类方法的类名? 例如,对于 Bar 类中名为 foo 的方法,它不应扩展为 foo,而应扩展为 Bar::foo.
Simlar question with LINE 但是当我用 __FUNCTION__ 替换 __LINE__ 时。宏连接字符串文字“__FUNCTION__”而不是实际的函数名称。 最佳答案 __
Simlar question with LINE 但是当我用 __FUNCTION__ 替换 __LINE__ 时。宏连接字符串文字“__FUNCTION__”而不是实际的函数名称。 最佳答案 __
示例: @noreturn func setOnlyPropertyGetterError(__function__: String) { fatalError("\(__function__)
我定义了一个宏如下: #define ADD_TIME_ENTRY(_name_) m_pTimeMeasurement->addTimeEntry(_name_); 现在,我想通过 ADD_TI
我有一个带有 Windows 运行时组件项目的 Windows Phone 8 解决方案。在 WinRT 代码中,我想使用 __FUNCTION__ 从 C++ 类进行日志记录。但是,__FUNCTI
我有一个 C++ 库,它通过 crtdefs.h 使用预定义的宏 __FUNCTION__。宏已记录 here .这是我的用法: 我的.cpp #include ... void f() {
我发现以下代码可以将日志添加到系统日志中。但是,如果我还想将 __FUNCTION__ 信息添加到系统日志,该怎么做? openlog(basename(argv[0]), LOG_CONS | LO
使用 avr-gcc 可以将数据存储在程序内存中以节省 RAM。这是使用 PROGMEM attribute 完成的. AVR-libc 还提供了一个宏,PSTR() ,可用于文字字符串。 现在我正在
谁能告诉我什么时候 g++ 将 __FUNCTION__“宏”替换为包含函数名称的字符串?似乎在检查源代码的语法正确性之前它不能替换它,即以下将不起作用 #include #define DBG_W
我知道这两者之间的区别,我已经查看了手册。 我还是有些困惑。我可以在类的方法中使用 __FUNCTION__,这代表这个方法的名称。当我回应它时,它只输出名称。这里很清楚。 但为什么我可以在非 cal
有没有人对 C# 版本的 C++ __FUNCTION__ 宏有好的解决方案?编译器似乎不喜欢它。 最佳答案 尝试改用它。 System.Reflection.MethodBase.GetCurren
这应该是微不足道的,但我似乎无法弄清楚如何将 __FUNCTION__ 与字符串连接起来,尤其是在 GCC 上——尽管它适用于 VC++(我正在将一些代码移植到 Linux) #include #i
对于 gcc 项目,__FUNCTION__、__FILE__ 和 __func__ 返回的指针是否保证指向持久内存? (也就是说,我可以安全地引用另一个函数范围内的指针吗?)我知道 __func__
有什么方法可以打印__FUNCTION__作为 linux 上的宽字符? WIDEN 的技巧对我不起作用,gcc 编译器打印: 错误:?L_FUNCTION_?在这方面没有申明 有什么帮助吗? 谢谢
我尝试编写一个宽版本的__FUNCTION__ 来支持可移植代码(Windows 和Linux) #include #include #include typedef wchar_t WCHAR
我是一名优秀的程序员,十分优秀!