什么之间的区别__PRETTY_FUNCTION__,__FUNCTION__,__func__,和他们在哪里记录?我如何决定使用哪一个?
我想获取模板类型的字符串名称(const char*).不幸的是我无法访问RTTI.
template< typename T >
struct SomeClass
{
const char* GetClassName() const { return /* magic goes here */; }
}
Run Code Online (Sandbox Code Playgroud)
所以
SomeClass<int> sc;
sc.GetClassName(); // returns "int"
Run Code Online (Sandbox Code Playgroud)
这可能吗?我找不到办法,即将放弃.谢谢您的帮助.
我正在使用API,我发现自己编写了许多一般形式的错误处理代码:
if (errorCode = functionName(params))
printError(errorCode, "functionName", __LINE__, __FILE__);
Run Code Online (Sandbox Code Playgroud)
身体printError可能看起来像:
fprintf(stderr, "Error in function %s on line %d of file %s",
functionName, lineNumber, fileNumber);
Run Code Online (Sandbox Code Playgroud)
但是,每次硬编码函数名称都是一件痛苦的事.有没有办法得到导致错误的函数的名称,即在运行时或通过宏调用的最后一个函数?当然,我无法以任何方式修改API函数.有一些方法可以获得当前函数以及调用函数,但这些函数都不能从函数外部工作.
我将有数百个这样的功能
void OrganOut()
{
Title("OrganOut");
Run Code Online (Sandbox Code Playgroud)
第一行将功能的标题显示在LCD显示屏上(这是一个嵌入式音乐系统,您可能可以按名称猜测)。由于函数名称在编译时很明显,是否有任何方法可以自动将名称放置在Title中,以避免两次输入名称?
我想用C程序显示我当前的C文件.我知道可执行文件的名称可以通过argv[0].但我想要文件名作为'hello.c'例子.可能吗?
我目前正在阅读Scott Meyers的"Effective C++"一书.它说我应该更喜欢inline功能#define类似功能的宏.
现在我尝试编写内联函数来替换我的异常宏.我的旧宏看起来像这样:
#define __EXCEPTION(aMessage) \
{ \
std::ostringstream stream; \
stream << "EXCEPTION: " << aMessage << ", file " <<__FILE__ << " line " << __LINE__; \
throw ExceptionImpl(stream.str()); \
}
Run Code Online (Sandbox Code Playgroud)
我的新内联函数是这样的:
inline void __EXCEPTION(const std::string aMessage)
{
std::ostringstream stream;
stream << "EXCEPTION: " << aMessage << ", file " <<__FILE__ << " line " << __LINE__;
throw ExceptionImpl(stream.str());
}
Run Code Online (Sandbox Code Playgroud)
正如一些人可能已经预料的那样,现在__FILE__和__LINE__宏都没用了,因为它们总是引用带有内联函数定义的C++文件.
有没有办法规避这种行为,还是应该坚持我的旧宏?我在这里阅读了这些帖子,我已经怀疑我的第二个例子可能无法正常工作:
我正在尝试创建一个代码片段,它将打印一些带有当前文件名和当前方法/标签名称的控制台日志,就像我们在systrEclipse 中的方式一样。
虽然我可以在Tools > Options > Text editor > Snippet中添加代码片段,但我找不到任何标签来检索当前文件名。
示例文件(TestMyUI.js):
function doSomething{
console.log("TestMyUI.doSomething()");
}
Run Code Online (Sandbox Code Playgroud)
在这里,我喜欢console.log使用保存在片段中的模板来生成。因此,对于我输入类似内容的每个地方,consLog都必须自动完成填充当前文件和方法名称的日志。这与我们在 eclipse IDE 中的类似systr。
我编写了以下代码来将日志写入我的日志文件中。这段代码可以很好地记录消息,但现在我必须将其集成到多个文件中,我需要调用者的文件路径、调用者函数名称和行号。
请帮助我实现这一目标。
#include "Source.h"
bool CLogManager::fileOpenError = false;
std::string CLogManager::logFileName = "";
CLogManager* CLogManager::logManager = NULL;
FILE* CLogManager::file = NULL;
CLogManager :: CLogManager(){}
CLogManager :: ~CLogManager()
{
if (file)
fclose(file);
}
CLogManager* CLogManager::getInstance()
{
if(logManager==NULL)
{
logManager = new CLogManager();
logFileName = currentDateTime();
}
return logManager;
}
const std::string CLogManager::currentDateTime()
{
time_t now = time(0);
char currTime[30];
strftime(currTime, sizeof(currTime), "Log_%Y_%m_%dT%H_%M_%S.xml", localtime(&now));
return currTime;
}
void CLogManager::Log (char *message)
{
file = fopen(logFileName.c_str(), "a+");
if(file == NULL)
{
if(fileOpenError == false) …Run Code Online (Sandbox Code Playgroud) 我正在阅读__FUNCTION__/ __func__在C/C++中(它们用于打印使用它们的函数的名称).我读过的每个地方都说这些都是宏,并在预处理时被替换.所以,我通过使用命令查看预处理输出来调查这一点gcc -E prog.c.但是我发现函数名称既__func__没有__FUNCTION__被预处理器替换也没有被替换.
那么,它是一个宏吗?如果没有,它是什么以及如何实施?
编辑
甚至尝试过cpp prog.c.但仍未取代.
此外__FILE__,__LINE__在C++和__FUNCTION__使用这篇文章说,它永远不会影响性能.请澄清.
有没有办法在D中获取当前函数的名称?我正在寻找类似于__FUNCTION__C++的东西.
我想使用此名称将其传递给Exception.如果(当前)用户所在的当前平台不支持某个功能,则会抛出异常.
我需要C语言中的日志功能或宏,它应该在Linux中工作,可以接受格式字符串和参数列表,并且可以将调用者的函数名称附加到输出字符串.
这是一个例子.假设日志记录功能(宏)称为smart_log.看起来像:
smart_log(const char *fmt, ...)
Run Code Online (Sandbox Code Playgroud)
第一个参数fmt是一个格式字符串,就像printf中的格式字符串一样.fmt之后是feed fmt的其他参数列表.
假设一个名为example_function的函数以这种方式调用smart_log:
void example_function() {
smart_log("try to output number %d\n", 1);
}
Run Code Online (Sandbox Code Playgroud)
然后日志字符串看起来像:
[example_function]: try to output number 1
Run Code Online (Sandbox Code Playgroud)
所以关键是smart_log将调用者的函数附加到格式字符串.
我不知道如何在C中实现这一点.我认为可以使用宏来实现这一目标.
如果我的编译器支持这些预定义的宏(__FILE__, __LINE__, __func__),那么我可以安全地使用它们并假设它将始终根据以下内容报告正确的文件和行:__ FILE __, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
我还读到变量名,行号等与执行的程序集结束代码(从.cpp代码生成的实际.exe文件)无关,如果是这种情况那么这些宏在使用时如何工作在代码?如何__LINE__用汇编代码表示宏?.exe文件在遇到__LINE__宏时如何知道原始.cpp源的正确行号?