[Insight-developers] Enumeration type causes warning in XCode project

Mathieu Coursolle mcoursolle at rogue-research.com
Tue Mar 13 17:02:49 EST 2007


Hi,

Here is a patch for 2007/03/13 version which fixes those warnings for
the IO classes. I would really appreciated if someone could take a look
at it so it could be commited.

Please let me know if it could be part of CVS version.
Thanks a lot!

Mathieu

>Hi,
>
>I added new macros in itkMacro.h to support enum types. As explained
>previously,
>the itkDebugMacro causes warnings on some platform (XCode) when it
>receives an 
>enum type.
>
>So I added in itkMacro.h:
>
>- itkSetEnumMacro
>- itkGetEnumMacro
>- itkGetConstReferenceEnumMacro.
>
>Those macro basically cast the enum type into a long value for output.
>
>I currently use them in:
>
>- itkImageIOBase.h
>- itkGDCMImageIO.h
>- itkDICOMSeriesFileNames.h
>
>Those all the only one I changed yet cause they are causing the warnings
>in my application.
>
>If you agree to that change, I could parse all code and change whenever
>an enum is use with the
>itkDebugMacro. That fix would avoid lots of warnings when including itk
>headers.
>
>Please let me know if you want a patch for this. I would really
>appreciate those warnings to
>go away...
>
>Thanks.
>
>Mathieu
>
>-- 
>____________________________________________________________
>Mathieu Coursolle                   mcoursolle at rogue-research.com
>Rogue Research                      www.rogue-research.com 
>Montréal, Québec, Canada
>
>
>>This warning is caused because the itkSetMacro is in the header files
>included
>>in my project, so the warnings are in my project.
>>
>>Casting at the point where the warning occur would mean to cast in that
>>accessor. I could implement the Set accessor for the enum type members,
>>and cast
>>the enum into an long type for example in that implementation. Is the
>>itkSetMacro
>>use for another reason than avoid rewriting the same code everytime. I
>mean is
>>it a problem if this macro is replace by a Set method where the enum
would be
>>casted?
>>
>>Thanks.
>>
>>Mathieu
>>
>>>Another solution would be simply to cast the use of the enum values in
>>>streaming expressions to avoid the warning. (Perhaps conditionally
>>>based on some preprocessor definition.)
>>>
>>>Casting at the point where the warning occurs would be a "less
>>>intrusive" and more obviously backwards compatible change...
>>>
>>>Yes?
>>>David
>>>
>>>
>>>On 2/23/07, Mathieu Coursolle <mcoursolle at rogue-research.com> wrote:
>>>> Hi,
>>>>
>>>> We are currently using ITK in a Cocoa application build with XCode.
>>>> However, we get lots of warning related to enumeration types when
>>>> including some ITK headers.
>>>>
>>>> Ex: Warning: choosing 'int' over 'long unsigned int'
>>>>
>>>> This is mainly caused by the itkDebugMacro, which uses the << operator
>>>> of the itk::OStringStream to display some enum values. It seems like
>>>> the compiler does not see the same type as the << operator for those
>>>> enum types.
>>>>
>>>> Enum types might cause some issues asa they might not be of the same type
>>>> according to the compiler (32 or 64 bits for example).
>>>>
>>>> A solution to fix those issues and related warning would be to set the
>>>> type to use for those enums:
>>>>
>>>> Ex:  typedef enum { ELEMENT1, ELEMENT2, ELEMENT3} MyEnum;
>>>>
>>>> can be written:
>>>>
>>>> enum { ELEMENT1, ELEMENT2, ELEMENT3};
>>>> typedef int MyEnum;
>>>>
>>>> This causes MyEnum to be used as an int in all cases. I changed
>>>> the ones in itkImageIOBase.h, itkGDCMImageIO.h and DICOMSeriesFileName.h
>>>> to get rid of all the warnings I had.
>>>>
>>>> I would like to know if you would agree to commit such a change to
>>>> enumeration types in ITK.
>>>>
>>>> Thank you.
>>>>
>>>> Mathieu
>>>>
>>>> --
>>>> ____________________________________________________________
>>>> Mathieu Coursolle                   mcoursolle at rogue-research.com
>>>> Rogue Research                      www.rogue-research.com
>>>> Montréal, Québec, Canada
>>>>
>>>> _______________________________________________
>>>> Insight-developers mailing list
>>>> Insight-developers at itk.org
>>>> http://www.itk.org/mailman/listinfo/insight-developers
>>>>
>>>
>>
>>
>>_______________________________________________
>>Insight-developers mailing list
>>Insight-developers at itk.org
>>http://www.itk.org/mailman/listinfo/insight-developers
>>
>
>
>
>
-------------- next part --------------
? Code/.DS_Store
Index: Code/Common/itkMacro.h
===================================================================
RCS file: /cvsroot/Insight/Insight/Code/Common/itkMacro.h,v
retrieving revision 1.69
diff -r1.69 itkMacro.h
188a189,237
>   
>   /** Set built-in type.  Creates member Set"name"() (e.g., SetVisibility());
>   * This should be use when the type is an enum. It is use to avoid warnings on
>   * some compilers with non specified enum types passed to itkDebugMacro.*/
> #define itkSetEnumMacro(name,type) \
>   virtual void Set##name (const type _arg) \
>   { \
>     itkDebugMacro("setting " #name " to " << static_cast<long>(_arg)); \
>     if (this->m_##name != _arg) \
>       { \
>       this->m_##name = _arg; \
>       this->Modified(); \
>       } \
>   } 
> 
> /** Get built-in type.  Creates member Get"name"() (e.g., GetVisibility()); 
>   * This should be use when the type is an enum. It is use to avoid warnings on
>   * some compilers with non specified enum types passed to itkDebugMacro.*/
> #define itkGetEnumMacro(name,type) \
>   virtual type Get##name () \
>   { \
>     itkDebugMacro("returning " << #name " of " << static_cast<long>(this->m_##name) ); \
>     return this->m_##name; \
>   }
> 
> /** Get built-in type.  Creates member Get"name"() (e.g., GetVisibility());
>  * This is the "const" form of the itkGetMacro.  It should be used unless
>  * the member can be changed through the "Get" access routine. 
>  * This should be use when the type is an enum. It is use to avoid warnings on
>  * some compilers with non specified enum types passed to itkDebugMacro.*/
> #define itkGetConstEnumMacro(name,type) \
>   virtual type Get##name () const \
>   { \
>     itkDebugMacro("returning " << #name " of " << static_cast<long>(this->m_##name) ); \
>     return this->m_##name; \
>   }
> 
> /** Get built-in type.  Creates member Get"name"() (e.g., GetVisibility());
>  * This is the "const" form of the itkGetMacro.  It should be used unless
>  * the member can be changed through the "Get" access routine.
>  * This versions returns a const reference to the variable. 
>  * This should be use when the type is an enum. It is use to avoid warnings on
>  * some compilers with non specified enum types passed to itkDebugMacro.*/
> #define itkGetConstReferenceEnumMacro(name,type) \
>   virtual const type & Get##name () const \
>   { \
>     itkDebugMacro("returning " << #name " of " << static_cast<long>(this->m_##name) ); \
>     return this->m_##name; \
>   }
Index: Code/IO/itkDICOMSeriesFileNames.h
===================================================================
RCS file: /cvsroot/Insight/Insight/Code/IO/itkDICOMSeriesFileNames.h,v
retrieving revision 1.10
diff -r1.10 itkDICOMSeriesFileNames.h
131,132c131,132
<   itkSetMacro(FileNameSortingOrder, FileNameSortingOrderType);
<   itkGetMacro(FileNameSortingOrder, FileNameSortingOrderType);
---
>   itkSetEnumMacro(FileNameSortingOrder, FileNameSortingOrderType);
>   itkGetEnumMacro(FileNameSortingOrder, FileNameSortingOrderType);
Index: Code/IO/itkGDCMImageIO.h
===================================================================
RCS file: /cvsroot/Insight/Insight/Code/IO/itkGDCMImageIO.h,v
retrieving revision 1.30
diff -r1.30 itkGDCMImageIO.h
211,212c211,212
<   itkSetMacro(CompressionType,TCompressionType);
<   itkGetConstReferenceMacro(CompressionType,TCompressionType);
---
>   itkSetEnumMacro(CompressionType,TCompressionType);
>   itkGetConstReferenceEnumMacro(CompressionType,TCompressionType);
Index: Code/IO/itkImageIOBase.h
===================================================================
RCS file: /cvsroot/Insight/Insight/Code/IO/itkImageIOBase.h,v
retrieving revision 1.40
diff -r1.40 itkImageIOBase.h
136,137c136,137
<   itkSetMacro(PixelType, IOPixelType);
<   itkGetConstReferenceMacro(PixelType, IOPixelType);
---
>   itkSetEnumMacro(PixelType, IOPixelType);
>   itkGetConstReferenceEnumMacro(PixelType, IOPixelType);
149,150c149,150
<   itkSetMacro(ComponentType,IOComponentType);
<   itkGetConstReferenceMacro(ComponentType,IOComponentType);
---
>   itkSetEnumMacro(ComponentType,IOComponentType);
>   itkGetConstReferenceEnumMacro(ComponentType,IOComponentType);
182,183c182,183
<   itkSetMacro(FileType,FileType);
<   itkGetConstReferenceMacro(FileType,FileType);
---
>   itkSetEnumMacro(FileType,FileType);
>   itkGetConstReferenceEnumMacro(FileType,FileType);
200,201c200,201
<   itkSetMacro(ByteOrder,ByteOrder);
<   itkGetConstReferenceMacro(ByteOrder,ByteOrder);
---
>   itkSetEnumMacro(ByteOrder,ByteOrder);
>   itkGetConstReferenceEnumMacro(ByteOrder,ByteOrder);


More information about the Insight-developers mailing list