gpt4 book ai didi

c - 确保预处理器定义不会更改值

转载 作者:太空狗 更新时间:2023-10-29 15:31:12 24 4
gpt4 key购买 nike

在实现C标准的Annex K(Bounds-checking Interfaces)时,有如下要求:

可以通过定义 __STDC_WANT_LIB_EXT1__ 来“请求”声明本附件中指定的扩展。至 1 , 并要求通过将其定义为 0 来声明 .

然后就是这段话:

Within a preprocessing translation unit, __STDC_WANT_LIB_EXT1_ _ shall be defined identically for all inclusions of any headers from subclause K.3. If __STDC_WANT_LIB_EXT1_ _ is defined differently for any such inclusion, the implementation shall issue a diagnostic as if a preprocessor error directive were used.

我想知道如何实现它。我继续并天真地写了这个(包含在每个受影响的 header 中):

#ifndef __STDC_WANT_LIB_EXT1__
#ifdef __STDC_WANT_LIB_EXT1_PREVIOUS__
#error __STDC_WANT_LIB_EXT1__ undefined when it was defined previously.
#endif
#else
#ifdef __STDC_WANT_LIB_EXT1_PREVIOUS__
#if __STDC_WANT_LIB_EXT1__ != __STDC_WANT_LIB_EXT1_PREVIOUS__
#error __STDC_WANT_LIB_EXT1__ defined to different value from previous include.
#endif
#else
#define __STDC_WANT_LIB_EXT1_PREVIOUS__ __STDC_WANT_LIB_EXT1__
#endif
#endif

这(当然)由于多种原因不起作用:

  • __STDC_WANT_LIB_EXT1__ 时没有捕捉到大小写没有为第一个包含定义,但为第二个定义(也应该用 #error 捕获)
  • #define不采用 __STDC_WANT_LIB_EXT1__ (前缀 # 会将符号作为字符串,通过 symbol2value(...) 会将 1 作为字符串)。
  • ...

...但如果将其视为伪代码,它会展示其背后的逻辑。

我不太精通像这样更复杂的预处理器业务,因为您通常被告知要远离宏魔法。 必须有一种方法来实现引用的要求;它只是不适合我。

有什么想法吗?


要完成[mcve],将上面的代码放入header.h ,这在 testme.c 中:

#define __STDC_WANT_LIB_EXT1__ 0
#include "header.h"
#define __STDC_WANT_LIB_EXT1__ 1
#include "header.h"

int main() {}

应该触发“不同值”错误消息。

最佳答案

@HWalters 确实让我走上了正确的轨道:

#ifndef __STDC_WANT_LIB_EXT1__
#ifdef __STDC_WANT_LIB_EXT1_PREVIOUS__
#if __STDC_WANT_LIB_EXT1_PREVIOUS__ != -1
#error __STDC_WANT_LIB_EXT1__ undefined when it was defined earlier.
#endif
#else
#define __STDC_WANT_LIB_EXT1_PREVIOUS__ -1
#endif
#else
#ifdef __STDC_WANT_LIB_EXT1_PREVIOUS__
#if __STDC_WANT_LIB_EXT1__ != __STDC_WANT_LIB_EXT1_PREVIOUS__
#error __STDC_WANT_LIB_EXT1__ redefined from previous value.
#endif
#else
#if __STDC_WANT_LIB_EXT1__ == 0
#define __STDC_WANT_LIB_EXT1_PREVIOUS__ 0
#elif __STDC_WANT_LIB_EXT1__ == 1
#define __STDC_WANT_LIB_EXT1_PREVIOUS__ 1
#else
/* Values other than 0,1 reserved for future use */
#define __STDC_WANT_LIB_EXT1_PREVIOUS__ -2
#endif
#endif
#endif

“thinko”是这一行:

#define __STDC_WANT_LIB_EXT1_PREVIOUS__ __STDC_WANT_LIB_EXT1__

将“previous”定义为另一个标记的实际值使其有效。

虽然解决方案并不完美——除了 0,1,undefined 之外的所有“其他”值都集中到一个“先前”值 (-2) 中,而标准的字母表示 any 重新定义应该发出诊断。

关于c - 确保预处理器定义不会更改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55999445/

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