关于__FILE__,__LINE__宏的问题

菜鸟一只_热爱ASM 2014-10-23 12:29:15
hi all
我问想一下,我们平常log类经常使用__FILE__,__LINE__这类宏,定义一个比如


#define PRINT_MSG(msg) printf("%s,%d, %s\n", __FILE__, __LINE__, msg)

这类方法来打印调用这个宏的当前文件和行号,我想问一下除了用宏定义的方法,还有别的访问可以获得吗?

还有这问题延伸了另外一个问题,用宏怎么调用一个类的非静态成员函数,

#define CALL_FUNC(arg) 某类的方法名

不用先声明一个全局类对象的方法

ClassA testa;
#define CALL_FUNC(arg) testa.func(arg)


先谢谢大家的指导。
...全文
180 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2014-10-23
  • 打赏
  • 举报
回复
1. 只能用宏。 2. 这个用宏不好,还是正常用函数吧。
sumos 2014-10-23
  • 打赏
  • 举报
回复
与其考虑宏,还不如看看这个

class T
{
public:
	void Test()
	{ 
		std::function<void(int)> func = std::bind(&T::Do, this, placeholders::_1);
		func(123);
	}
	void Do(int t)
	{ }
};

int main(int, char**)
{
	T t;
	t.Test();

	system("pause");
	return 0;
}
赵4老师 2014-10-23
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E Collapse AllExpand All Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript Visual Basic C# Visual C++ J# JScript C/C++ Preprocessor Reference Predefined Macros See Also Send Feedback Names the predefined ANSI C and Microsoft C++ implementation macros. The compiler recognizes predefined ANSI C macros and the Microsoft C++ implementation provides several more. These macros take no arguments and cannot be redefined. Some of the predefined macros listed below are defined with multiple values. See the following tables for more information. Macro Description __DATE__ The compilation date of the current source file. The date is a string literal of the form Mmm dd yyyy. The month name Mmm is the same as for dates generated by the library function asctime declared in TIME.H. __FILE__ The name of the current source file. __FILE__ expands to a string surrounded by double quotation marks. To ensure that the full path to the file is displayed, use /FC (Full Path of Source Code File in Diagnostics). You can create your own wide string version of __FILE__ as follows: Copy Code #include <stdio.h> #define WIDEN2(x) L ## x #define WIDEN(x) WIDEN2(x) #define __WFILE__ WIDEN(__FILE__) wchar_t *pwsz = __WFILE__; int main() {} __LINE__ The line number in the current source file. The line number is a decimal integer constant. It can be altered with a #line directive. __STDC__ Indicates full conformance with the ANSI C standard. Defined as the integer constant 1 only if the /Za compiler option is given and you are not compiling C++ code; otherwise is undefined. __TIME__ The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss. __TIMESTAMP__ The date and time of the last modification of the current source file, expressed as a string literal in the form Ddd Mmm Date hh:mm:ss yyyy, where Ddd is the abbreviated day of the week and Date is an integer from 1 to 31. Macro Description _ATL_VER Defines the ATL version. _CHAR_UNSIGNED Default char type is unsigned. Defined when /J is specified. __CLR_VER Defines the version of the common language runtime used when the application was compiled. The value returned will be in the following format: Mmmbbbbb where, M is the major version of the runtime. mm is the minor version of the runtime. bbbbb is the build number. Copy Code // clr_ver.cpp // compile with: /clr using namespace System; int main() { Console::WriteLine(__CLR_VER); } __cplusplus_cli Defined when compiling with /clr, /clr:pure, or /clr:safe. Value of __cplusplus_cli is 200406. __cplusplus_cli is in effect throughout the translation unit. Copy Code // cplusplus_cli.cpp // compile with: /clr #include "stdio.h" int main() { #ifdef __cplusplus_cli printf("%d\n", __cplusplus_cli); #else printf("not defined\n"); #endif } __COUNTER__ Expands to an integer starting with 0 and incrementing by 1 every time it is used in a compiland. __COUNTER__ remembers its state when using precompiled headers. If the last __COUNTER__ value was 4 after building a precompiled header (PCH), it will start with 5 on each PCH use. __COUNTER__ lets you generate unique variable names. You can use token pasting with a prefix to make a unique name. For example: Copy Code // pre_mac_counter.cpp #include <stdio.h> #define FUNC2(x,y) x##y #define FUNC1(x,y) FUNC2(x,y) #define FUNC(x) FUNC1(x,__COUNTER__) int FUNC(my_unique_prefix); int FUNC(my_unique_prefix); int main() { my_unique_prefix0 = 0; printf_s("\n%d",my_unique_prefix0); my_unique_prefix0++; printf_s("\n%d",my_unique_prefix0); } __cplusplus Defined for C++ programs only. _CPPLIB_VER Defined if you include any of the C++ Standard Library headers; reports which version of the Dinkumware header files are present. _CPPRTTI Defined for code compiled with /GR (Enable Run-Time Type Information). _CPPUNWIND Defined for code compiled with /GX (Enable Exception Handling). _DEBUG Defined when compiling with /LDd, /MDd, and /MTd. _DLL Defined when /MD or /MDd (Multithread DLL) is specified. __FUNCDNAME__ Valid only within a function and returns the decorated name of the enclosing function (as a string). __FUNCDNAME__ is not expanded if you use the /EP or /P compiler option. __FUNCSIG__ Valid only within a function and returns the signature of the enclosing function (as a string). __FUNCSIG__ is not expanded if you use the /EP or /P compiler option. On a 64-bit operating system, the calling convention is __cdecl by default. __FUNCTION__ Valid only within a function and returns the undecorated name of the enclosing function (as a string). __FUNCTION__ is not expanded if you use the /EP or /P compiler option. _INTEGRAL_MAX_BITS Reports the maximum size (in bits) for an integral type. Copy Code // integral_max_bits.cpp #include <stdio.h> int main() { printf("%d\n", _INTEGRAL_MAX_BITS); } _M_ALPHA Defined for DEC ALPHA platforms (no longer supported). _M_CEE Defined for a compilation that uses any form of /clr (/clr:oldSyntax, /clr:safe, for example). _M_CEE_PURE Defined for a compilation that uses /clr:pure. _M_CEE_SAFE Defined for a compilation that uses /clr:safe. _M_IX86 Defined for x86 processors. See Values for _M_IX86 for more details. _M_IA64 Defined for Itanium Processor Family 64-bit processors. _M_IX86_FP Expands to a value indicating which /arch compiler option was used: 0 if /arch was not used. 1 if /arch:SSE was used. 2 if /arch:SSE2 was used. See /arch (Minimum CPU Architecture) for more information. _M_MPPC Defined for Power Macintosh platforms (no longer supported). _M_MRX000 Defined for MIPS platforms (no longer supported). _M_PPC Defined for PowerPC platforms (no longer supported). _M_X64 Defined for x64 processors. _MANAGED Defined to be 1 when /clr is specified. _MFC_VER Defines the MFC version. For example, 0x0700 represents MFC version 7. _MSC_EXTENSIONS This macro is defined when compiling with the /Ze compiler option (the default). Its value, when defined, is 1. _MSC_VER Reports the major and minor versions of the compiler. For example, 1310 for Microsoft Visual C++ .NET 2003. 1310 represents version 13 and a 1.0 point release. The Visual C++ 2005 compiler version is 1400. Type cl /? at the command line to see the major and minor versions of your compiler along with the build number. __MSVC_RUNTIME_CHECKS Defined when one of the /RTC compiler options is specified. _MT Defined when /MD or /MDd (Multithreaded DLL) or /MT or /MTd (Multithreaded) is specified. _NATIVE_WCHAR_T_DEFINED Defined when /Zc:wchar_t is used. _OPENMP Defined when compiling with /openmp, returns an integer representing the date of the OpenMP specification implemented by Visual C++. Copy Code // _OPENMP_dir.cpp // compile with: /openmp #include <stdio.h> int main() { printf("%d\n", _OPENMP); } _VC_NODEFAULTLIB Defined when /Zl is used; see /Zl (Omit Default Library Name) for more information. _WCHAR_T_DEFINED Defined when /Zc:wchar_t is used or if wchar_t is defined in a system header file included in your project. _WIN32 Defined for applications for Win32 and Win64. Always defined. _WIN64 Defined for applications for Win64. _Wp64 Defined when specifying /Wp64. As shown in following table, the compiler generates a value for the preprocessor identifiers that reflect the processor option specified. Option in Development Environment Command-Line Option Resulting Value Blend /GB _M_IX86 = 600 (Default. Future compilers will emit a different value to reflect the dominant processor.) Pentium /G5 _M_IX86 = 500 Pentium Pro, Pentium II, and Pentium III /G6 _M_IX86 = 600 80386 /G3 _M_IX86 = 300 80486 /G4 _M_IX86 = 400 See Also Concepts Macros (C/C++) Preprocessor Operators Preprocessor Directives Send feedback on this topic to Microsoft.
勤奋的小游侠 2014-10-23
  • 打赏
  • 举报
回复
第二个问题,既然要调用类对像,肯定得有个类名吧? #define callfunc(objectname,func,arg) objectname.func(arg)

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧