Turn off VS.NET 2005 deprecation
If you've been compiling projects created using earlier versions of VisualStudio in VisualStudio 2005 then you have most certainly noticed the new security warnings that get displayed whenever an in-secure CRT routine is invoked from your code. If you call strcpy
for instance, you'd see this:
warning C4996: 'strcpy' was declared deprecated
This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_DEPRECATE. See online help for details.
If you're writing new code then it is generally a good idea to listen to this warning and change your code. If you are building an existing project however (an open source project for example) then you're likely to get hundreds of C4996
warnings. One straightforward way of turning them off is to disable deprecation warnings by defining _CRT_SECURE_NO_DEPRECATE
.
If you've got a large solution with 15-20 projects and 2-3 build configurations in each then defining this symbol for each project can be one seriously daunting task. In a 10 project solution with each project having a "Debug" and a "Release" configuration for instance you'd have to define this symbol in the project properties dialog 20 times (10 * 2)! I found myself having to do this often enough to warrant the writing of a small VisualStudio macro to do the job. This macro captures the preprocessor definitions from an input box and adds it to all the configurations of each project that is currently selected in the solution explorer. Here's the macro definition:
Public Sub AddPreprocessorMacroToAllProjects()
'
' check whether at least one project has been selected
'
If DTE.ActiveSolutionProjects.Length = 0 Then
MsgBox("Please select the Visual C++ project(s) " + _
"to which you would like a macro to be added.")
Exit Sub
End If
'
' get the macro names and values
'
retry:
Dim macro As String
macro = InputBox("Please enter one or more macros " + _
"(e.g. _WIN32_WINNT=0x0500; WINVER=0x0500)", _
"Enter Macros").Trim()
If macro.Length = 0 Then
If MsgBox("An empty macro was entered. Retry?", _
MsgBoxStyle.YesNo, _
"Wrong macro") = MsgBoxResult.Yes Then
GoTo retry
Else
Exit Sub
End If
End If
'
' now iterate through each project in the array and add the
' macro to all the configurations of all visual c++ projects
'
Dim i As Integer
Dim project As Project
Dim VCProjectKind As String = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"
For i = 0 To DTE.ActiveSolutionProjects.Length - 1
project = DTE.ActiveSolutionProjects(i)
'
' is it a visual c++ project?
'
If project.Kind = VCProjectKind Then
Dim vcproj As Microsoft.VisualStudio.VCProjectEngine.VCProject
vcproj = project.Object
Dim j As Integer
'
' iterate through each configuration on this project
'
For j = 1 To vcproj.Configurations.Count
Dim config As Microsoft.VisualStudio.VCProjectEngine.VCConfiguration
config = vcproj.Configurations(j)
'
' now add the macro to the compiler settings of this configuration
'
Dim cl As Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool
cl = config.Tools("VCCLCompilerTool")
cl.PreprocessorDefinitions = cl.PreprocessorDefinitions + "; " + macro
Next
End If
Next
MsgBox("Done.")
End Sub
Feel free to use it if you find it useful!