gpt4 book ai didi

C 预处理无法在 #error 后立即停止

转载 作者:太空狗 更新时间:2023-10-29 17:23:31 26 4
gpt4 key购买 nike

我今天的问题应该不是很复杂,但我就是找不到原因/解决方案。作为一个可重现的小例子,请考虑以下玩具 C 代码

#define _state_ 0

#if _state_ == 1
int foo(void) {return 1;}
#else

/* check GCC flags first
note that -mfma will automatically turn on -mavx, as shown by [gcc -mfma -dM -E - < /dev/null | egrep "SSE|AVX|FMA"]
so it is sufficient to check for -mfma only */

#ifndef __FMA__
#error "Please turn on GCC flag: -mfma"
#endif

#include <immintrin.h> /* All OK, compile C code */
void foo (double *A, double *B) {
__m256d A1_vec = _mm256_load_pd(A);
__m256d B_vec = _mm256_broadcast_sd(B);
__m256d C1_vec = A1_vec * B_vec;
}
#endif

我要编译这个test.c文件

gcc -fpic -O2 -c test.c

请注意,我没有打开 GCcflags -mfma,因此将触发 #error。我期望的是,在 GCC 看到此 #error 后,编译将立即停止,但这是我在 GCC 5.3 中得到的结果:

test.c:14:2: error: #error "Please turn on GCC flag: -mfma"
#error "Please turn on GCC flag: -mfma"
^
test.c: In function ‘foo’:
test.c:22:11: warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
__m256d A1_vec = _mm256_load_pd(A);
^

GCC 确实停止了,但为什么它还在 #error 之后选择了一行?有什么解释吗?谢谢。


对于想要尝试的人来说,有一些硬件要求。您需要带有 AVX FMA 指令集的 x86-64。

最佳答案

我有一份 C ISO 规范的草稿副本,在 §4/4 中 - 它指出

The implementation shall not successfully translate a preprocessing translation unit containing a #error preprocessing directive unless it is part of a group skipped by conditional inclusion.

稍后,在 §6.10.5 中,#error 被正式定义,它说

A preprocessing directive of the form # error pp-tokens opt new-line causes the implementation to produce a diagnostic message that includes the specified sequence of preprocessing tokens.

换句话说,规范只要求任何有#error的代码只需要在编译过程中失败并报告错误消息,而不是编译需要立即终止,因为一旦到达#error

鉴于始终在编译器报告的顶级错误之前检查顶级错误被认为是一种很好的做法,我可以想象一个称职的程序员看到一串以 #error 开头的错误指令可能知道发生了什么。

关于C 预处理无法在 #error 后立即停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463958/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com