C++ static char THIS_FILE[] = __FILE__;

本文深入探讨了C++中预编译器常量的使用,包括__FILE__、__LINE__、__DATE__、__TIME__、__TIMESTAMP__等,并通过代码示例展示了如何在调试和配置中利用这些常量。
 C++ static char THIS_FILE[] = __FILE__;
__FILE__为预编译器常量,返回当前编译的文件名,还有比较常用的几个预编译器常量,
__LINE__编译器在编译的文件的第几行;
__DATE__返回当前的日期Jul-20-2004;
__TIME__返回当前的时间hh:mm:ss;  

__TIMESTAMP__ 的预定义的编译器宏始终返回时间戳信息在太平洋标准的时间内无论本地时间和CL.EXE 的运行位置在计算机上的时区。
   
__STDC__条件编译,意思是:如果定义了标准C或c++,那么编译这句话后面直到#endif 以前的源代码。
_STDC__cplusplus这两个都是标准宏,_STDC_表示是是否符合标准C
_cplusplus表示是否是C++


如下为宏定义:
#ifdef _DEBUG //如果定义了_DEBUG
#define new DEBUG_NEW //则定义new为DEBUG_NEW
#undef THIS_FILE //反定义,即清除THIS_FILE的宏定义
static char THIS_FILE[] = __FILE__;
#endif //结束宏定义   
__FILE__标准C++推荐编译器实现时预定义的宏

看看Thinking in C++(C++编程思想)
__FILE__是由编译器定义的宏,表示当前文件名。
常用于调试。报告错误时,我们可以方便地知道是哪个文件出错
vc++利用ADOX创建数据库 // ADOXCreateDatabaseDlg.cpp : implementation file // #include "stdafx.h" #include "ADOXCreateDatabase.h" #include "ADOXCreateDatabaseDlg.h" #include "Shlwapi.h" #pragma comment(lib,"shlwapi.lib") // Download by http://www.codefans.net #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CADOXCreateDatabaseDlg dialog CADOXCreateDatabaseDlg::CADOXCreateDatabaseDlg(CWnd* pParent /*=NULL*/) : CDialog(CADOXCreateDatabaseDlg::IDD, pParent) { //{{AFX_DATA_INIT(CADOXCreateDatabaseDlg) m_dbName = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CADOXCreateDatabaseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CADOXCreateDatabaseDlg) DDX_Text(pDX, IDC_DBNAME, m_dbName); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CADOXCreateDatabaseDlg, CDialog) //{{AFX_MSG_MAP(CADOXCreateDatabaseDlg) ON_WM_SYSCOMM
### 关于C/C++ 编译错误 E1345 和 `static char THIS_FILE[] = __FILE__` 初始化问题 编译错误E1345通常与静态数组初始化有关,特别是在使用宏`__FILE__`时。`__FILE__`是一个预定义宏,用于指示当前源文件的名称。在某些编译器中(例如Visual Studio),直接用`__FILE__`初始化静态字符数组可能会导致问题[^1]。 以下是一些关键点: - 在某些编译器环境下(如Visual Studio),`__FILE__`的值可能包含路径信息,这会导致字符串长度超出预期,从而引发编译错误。 - 静态字符数组的初始化需要确保字符串字面量的长度适合数组的大小。如果`__FILE__`的值过长,可能会导致编译器报错。 - 为了兼容性,可以将`__FILE__`的值复制到动态分配的内存中,而不是直接初始化静态数组[^2]。 以下是修正代码的一个示例: ```c #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char* THIS_FILE = NULL; // 使用指针代替静态数组 #endif int main() { #ifdef _DEBUG if (THIS_FILE == NULL) { size_t len = strlen(__FILE__) + 1; THIS_FILE = (char*)malloc(len); // 动态分配内存 if (THIS_FILE != NULL) { strcpy(THIS_FILE, __FILE__); // 复制字符串 } } printf("File: %s\n", THIS_FILE); #endif return 0; } ``` 上述代码通过动态分配内存解决了静态数组初始化的问题。此外,还可以考虑使用`std::string`(如果使用C++)来避免手动管理内存[^3]。 ```cpp #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE std::string THIS_FILE = __FILE__; // 使用std::string代替静态数组 #endif int main() { #ifdef _DEBUG printf("File: %s\n", THIS_FILE.c_str()); #endif return 0; } ``` ### 注意事项 - 如果必须使用静态数组,可以明确指定数组大小以避免潜在的溢出问题。例如: ```c static char THIS_FILE[FILENAME_MAX] = {0}; // FILENAME_MAX是最大路径长度 strncpy(THIS_FILE, __FILE__, sizeof(THIS_FILE) - 1); ``` - 不同编译器对`__FILE__`的处理方式可能不同。例如,GCC会直接返回文件名,而Visual Studio可能会返回完整路径[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值