我可以在使用前定义

时间:2018-01-15 15:37:42

标签: c++ visual-c++ include

我有cpp和h类文件。类实现包含wcsncpy函数,只有在定义_CRT_SECURE_NO_WARNINGS时才可以使用。如果我在所有标题包含之前放置#define _CRT_SECURE_NO_WARNINGS,它就可以工作。但是为什么我不能在wcsncpy使用之前的标题或事件之后放置此行?

UPD

根据我的理解,我可以在代码中执行#define

int _tmain(int argc, _TCHAR* argv[])
{

#define a

#ifdef a
    std::wcout << _T("hello") << std::endl;
#endif

}

为什么下面的定义不起作用?

int main(void)
{
 ...
    #define _CRT_SECURE_NO_WARNINGS
    wcsncpy(dest, src, 4); 

 ...
}

1 个答案:

答案 0 :(得分:1)

您可以使用pragma warning在本地禁止警告(即使默认情况下将此视为错误):

#pragma warning(push)
#pragma warning(disable: 4996) // 'wcsncpy': This function or variable may be unsafe.
    wcsncpy(dest, src, 4); 
#pragma warning(pop)

甚至可以使用特定于Microsoft的__pragma keyword

将其包装在更易读的宏中
#define DISABLE_CRT_SECURE_WARNINGS() \
    __pragma(warning(push))           \
    __pragma(warning(disable: 4996))

#define RESTORE_CRT_SECURE_WARNINGS() \
    __pragma(warning(pop))

...
DISABLE_CRT_SECURE_WARNINGS();
wcsncpy(dst, src, 4);
RESTORE_CRT_SECURE_WARNINGS();