为什么使用#define会抛出"error: expected declaration specifiers"错误?
问题根因
- 触发错误的核心原因是你违反了C语言的基础语法规则:所有可执行语句(包含函数调用语句)只能放在函数内部,不允许出现在全局作用域。
- 你当前把
omp_set_num_threads(N_THR);直接写在了头文件引入、宏定义的全局区域,编译器在全局域只接受变量、函数的声明/定义,遇到函数调用语句就会判定为语法错误。 - 串行版本编译正常是因为未启用OpenMP时
_OPENMP宏不会被定义,那行错误代码不会参与编译,自然不会触发报错。
修复方法
把omp_set_num_threads(N_THR)调用移到main函数的起始位置即可,同时你注释掉的omp_set_dynamic(false)也可以一并移到此处,修正后的代码示例:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #define N_THR 1 #define MIN_SIZE 3 //NOTE: min_size is inclusive here #ifdef _OPENMP #include <omp.h> #undef N_THR #define N_THR 4 #undef MIN_SIZE #define MIN_SIZE N_THR #endif int main(void) { #ifdef _OPENMP omp_set_dynamic(false); // 关闭动态线程数调整,强制使用指定线程数 omp_set_num_threads(N_THR); #endif // 此处写入你的原有业务逻辑代码 return 0; }
修改后重新加-fopenmp参数编译即可正常通过。
内容的提问来源于stack exchange,提问作者Jim Davidson Mark David
相关产品推荐
相关产品推荐

