gpt4 book ai didi

c - 如何生成编译错误以防止将某些值传递给函数

转载 作者:行者123 更新时间:2023-12-02 08:03:48 25 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改善这个问题吗?通过 editing this post 添加详细信息并澄清问题.

2年前关闭。




Improve this question




不是这个:How to generate a compilation error when pointer types differ?

那个有用,但我想阻止值,而不是类型。例如:

#include <stdio.h>
#include <conio.h>

char * num_sys_convert(int num_value, int old_base, int targeted_base) {
/* These are the codes. Only clever people can see it. The king would surely be pleased to see this. */
}

int main() {
printf("%s",num_sys_convert(10011,2,10)); // this should be fine
printf("%s",num_sys_convert(10021,2,10)); // this should generate a compile-time error
getch();
}

我正在尝试制作标题,以防在打字时出现错误,我想添加一个小功能来帮助解决这个问题。由于旧基数是二进制的,因此数字 2 (或更高)不应该存在于给定数字的十进制表示中。

在 C 中是否可以在编译时阻止某些值作为参数进入函数?

最佳答案

这是一个特定于这个函数的丑陋的 cludge,但你可以这样做:

#define num_sys_convert(x, b1, b2) \
((void)(struct digits { \
int d1:(( (x) %10 >= (b1) ? -1 : 1)); \
int d2:((((x) / 10)%10 >= (b1) ? -1 : 1)); \
int d3:((((x) / 100)%10 >= (b1) ? -1 : 1)); \
int d4:((((x) / 1000)%10 >= (b1) ? -1 : 1)); \
int d5:((((x) / 10000)%10 >= (b1) ? -1 : 1)); \
int d6:((((x) / 100000)%10 >= (b1) ? -1 : 1)); \
int d7:((((x) / 1000000)%10 >= (b1) ? -1 : 1)); \
int d8:((((x) / 10000000)%10 >= (b1) ? -1 : 1)); \
int d9:((((x) / 100000000)%10 >= (b1) ? -1 : 1)); \
int da:((((x) /1000000000)%10 >= (b1) ? -1 : 1)); \
}){0}, num_sys_convert_real(x, b1, b2))


char * num_sys_convert_real(int num_value, int old_base, int targeted_base) {
...
}

真正的函数是通过调用上述宏来包装的。该宏定义了一个具有多个位域的结构,其中每个位域的长度取决于第一个参数的特定十进制数字。如果该数字大于或等于第二个参数(即基数)的值,则位域的大小设置为 -1,这是无效的并产生编译错误。

如果数字看起来确实是给定基数的有效数字,则最终结果是给定结构类型的临时对象是通过复合文字创建的,并在表达式中用作逗号运算符的左侧,这意味着它的值被丢弃,实际的函数调用是逗号运算符的右侧。

这是在以下假设下工作的:
  • 该函数的第一个参数是 十进制整数文字
  • 该函数的第二个参数是 整数文字
  • 文字类型为 int , 即没有类型后缀
  • int长度为 32 位

  • 它将 总是 如果您这样做,将无法编译:
    int value = 101;
    num_sys_convert(value, 2, 10);

    或这个:
    int base = 2;
    num_sys_convert(101, base, 10);

    因为用于设置位域大小的表达式必须是编译时常量表达式。

    此外,这将使检查失败:
    num_sys_convert(0x10, 2, 10);

    因为十六进制值 0x10 具有十进制值 16。

    这将通过检查:
    num_sys_convert(0xa, 2, 10);

    因为十六进制值 0xa 具有十进制值 10。

    由于这是一个杂物, 不要这样做 !

    与其在编译时尝试检查参数,不如在运行时在函数内部验证参数,并在参数无效时返回某种错误代码。

    关于c - 如何生成编译错误以防止将某些值传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53932643/

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