C++ 如何构建这个宏

C++ 如何构建这个宏,c++,c,C++,C,下面的代码 #include <stdio.h> #include <stdlib.h> #include <omp.h> #include <time.h> #define N 100 #define tam atoi(getenv("tam")) #if tam > 0 #endif #包括 #包括 #包括 #包括 #定义N 100 #定义tam原子(getenv(“tam”)) #如果tam>0 #恩迪夫 给出这个错误 testec

下面的代码

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#define N 100
#define tam atoi(getenv("tam"))
#if tam > 0
#endif
#包括
#包括
#包括
#包括
#定义N 100
#定义tam原子(getenv(“tam”))
#如果tam>0
#恩迪夫
给出这个错误

testec99.c:6:17:错误:在标记“(”之前缺少二进制运算符 #定义tam原子(getenv(“tam”)) ^ testec99.c:7:5:注意:在宏“tam”的展开中 #如果tam>0


但是如果我删除了#if,那么如果“tam”不是数组的维数,它就会正确运行。因此我需要获取环境变量的N值。有没有办法解决这个问题?

预处理器在编译时运行(甚至在它之前)

所以

不评估的结果

atoi(getenv("tam"))
但只是做一个文本替换

求值指令

 #if atoi(getenv("tam"))> 0
对于预处理器来说没有意义,因此会出现错误消息

getenv()
将在运行时进行计算。预处理器实际上不会执行您在此处似乎想要实现的操作


“有没有办法解决这个问题?”

是的,您可以使用编译器的
-D
选项来解析
$tam
环境值(例如,对于GCC工具链):


但奇怪的是,如果我不尝试创建一个大小为tam的数组,只打印tam的值,它就工作了。我遗漏了什么吗?@Joãopaulandrade“我遗漏了什么吗?”是的,说真的,
#如果tam>0
是在编译时执行的,而像
这样的东西则无法执行
 #if atoi(getenv("tam"))> 0
g++ -Dtam=$tam ...