当我使用 NVCC 编译我的 CUDA 代码并且我已经在代码中定义了一个预处理变量时,例如#define DEBUG_OUTPUT 0
,有没有办法在编译时动态覆盖这样的变量?我尝试指定 NVCC 选项-DDEBUG_OUTPUT=1
,但这不起作用:它给了我:
警告 C4005:“DEBUG_OUTPUT”:宏重新定义
当我使用 NVCC 编译我的 CUDA 代码并且我已经在代码中定义了一个预处理变量时,例如#define DEBUG_OUTPUT 0
,有没有办法在编译时动态覆盖这样的变量?我尝试指定 NVCC 选项-DDEBUG_OUTPUT=1
,但这不起作用:它给了我:
警告 C4005:“DEBUG_OUTPUT”:宏重新定义
无论您在 -D 之后指定什么,它都会在处理输入文件之前定义。但是,它不会删除文件中出现的定义。所以,如果你写-DDEBUG_OUTPUT
但你有#define DEBUG_OUTPUT
文件,后者是对前者的重新定义。要处理这种情况,您可以在文件中写入:
//if not specified earlier (e.g. by -D parameter)
#ifndef DEBUG_OUTPUT
//set it now to some default value
#define DEBUG_OUTPUT 0
#endif
注意,它实际上与 nvcc 无关。同样的行为出现在 C/C++ 中。
如果已经定义了预处理器宏并且您确定不需要原来的任何东西,只需有条件地重新定义它:
#ifdef MYMACRO
# undef MYMACRO
#endif
#define MYMACRO my macro content