#ifdef 单独的标头中,无法按预期工作
#ifdef in separate header not working as expected
我在单独的头文件中有一个 #define:
#ifndef __sitkConfigure_h
#define __sitkConfigure_h
#define SITK_4D_IMAGES
#endif // __sitkConfigure_h
(完整来源:https://github.com/kaspermarstal/SimpleITK/blob/8be437486dce85da271576f866393cd54fe0f865/Code/Common/src/sitkConfigure.h.in。定义由#cmakedefine
管理,并在配置 cmake 时按预期变为#define SITK_4D_IMAGES
。
像往常一样,标头包含在需要配置的地方。例如:
#include "sitkConfigure.h"
#ifdef SITK_4D_IMAGES
/** brief Constructor for 4D images where pixel type can be specified.
* @{
*/
Image( unsigned int width, unsigned int height, unsigned int depth, unsigned int length, PixelIDValueEnum valueEnum );
/**@}*/
#endif // #ifdef SITK_4D_IMAGES
和
#include "sitkConfigure.h"
#ifdef SITK_4D_IMAGES
Image::Image( unsigned int Width, unsigned int Height, unsigned int Depth, unsigned int Length, PixelIDValueEnum ValueEnum )
: m_PimpleImage( NULL )
{
Allocate ( Width, Height, Depth, Length, ValueEnum, 0 );
}
#endif // #ifdef SITK_4D_IMAGES
(完整资料来源:https://github.com/kaspermarstal/SimpleITK/blob/8be437486dce85da271576f866393cd54fe0f865/Code/Common/include/sitkImage.h 和 https://github.com/kaspermarstal/SimpleITK/blob/8be437486dce85da271576f866393cd54fe0f865/Code/Common/src/sitkImage.cxx)
为什么#ifdef
不是由sitkConfigure.h
中的#define
触发的?这简直让我发疯。如果我#define SITK_4D_IMAGES
直接放入文件中,则会按预期触发#ifdef
。此外,如果我用sitkConfigure.h
编写#define SITK_4D_IMAGES 1
并在其他文件中编写#define SITK_4D_IMAGES 2
,编译器会抱怨重新定义SITK_4D_IMAGES
,因此它可以清楚地看到包含标头的文件中的定义。
在带有GCC 4.8.9的Ubuntu 14.10和带有Apple Clang 600.0.56的Mac OSX Yosemite上进行了测试。非常欢迎您git clone -b development --single-branch git://github.com/kaspermarstal/SimpleITK.git
复制。
做了一个最小的示例,但无法重现该错误。问题一定出在SimpleITK的构建基础设施上。如果有人感兴趣,可以从 dropbox.com/s/zlcnqtx32cq4q22/example.zip?dl=0 下载。
拼搭说明:
git clone -b development --single-branch git://github.com/kaspermarstal/SimpleITK.git
mkdir build
cd build
cmake ../SimpleITK/SuperBuild
ccmake .
将SITK_4D_IMAGES
设置为ON
、配置、生成和make -j4
。超级构建下载、构建和安装所有依赖项。
正确处理#ifdefs
。该问题与使用 SWIG 将接口包装在 Python/Java/R/Ruby/Octave/Tcl/Lua/C# 中有关。定义没有传递给SWIG,因此SWIG没有编译#ifdef
内部的内容。将%include "sitkConfigure.h"
添加到 SWIG .i 文件解决了该问题。
- 如何在C++中从两个单独的for循环中添加两个数组
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 用C++在单独的头文件中完成函数体
- 类模板的成员功能的定义在单独的TU中完全专业化
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何使用单独文件中的派生类访问友元函数对象
- CoInitialize()在单独的线程上崩溃而不返回
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 当在函数调用中递增值时,程序正常工作,但是如果我们在单独的行中增加值而不是呼叫函数,则会出现错误.为什么
- 如何创建一个在单独的方法中工作的c++随机正态分布
- #ifdef 单独的标头中,无法按预期工作
- C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行
- 为什么在单独的函数中创建 ncurses 小部件时不能正常工作?
- OpenGL帧缓冲函数不能在单独的类中完全工作
- 当调用一个单独的android线程时,Emit不工作
- c++ /OpenGL: vao单独工作,但不能一起工作