【问题标题】:Can #define be used to replace type declaration in c?#define 可以用来替换c中的类型声明吗?
【发布时间】:2015-08-25 10:24:23
【问题描述】:

我遇到了一个问题,在程序中用#define代替int如下

#define type int
int main()
{
 type *a,b;
}

这有效吗?尽管在我尝试打印变量 b 的大小时它给了我错误,说 b 未声明。我想知道这背后的具体原因。请告诉我。

一些用户告诉我,我隐藏了部分代码。我没有在上面的代码 sn-p 中给出printf 语句。下面是带有printf 的代码和给出错误的代码

#define type int;
int main()
{
 type* a, b;
 printf("%d",sizeof(b));
}

【问题讨论】:

  • 您显示的代码 sn-p 完全有效。它将a 声明为指向int 的指针,将b 声明为int。预处理器简单地将符号type 的所有实例替换为扩展名为int。如果您遇到错误,请使用您未向我们显示的其他代码。
  • 你在哪里打印sizeof(b)
  • 使用%zu 转换说明符打印size_t 类型的参数。
  • 宏是文本替换。 'int' 之后的分号也将被替换,因此您的声明为int;* a, b,这是一个语法错误。从您的宏定义中删除分号:#define type int,就像在您的第一个示例中一样。
  • 检查宏定义的结尾。那个分号不应该在那里。

标签: c macros c-preprocessor typedef


【解决方案1】:

是的,它可以使用,但请记住,宏和类型定义之间存在显着差异。预处理器会“机械地”替换每次出现的令牌,而typedef 定义了真正的类型同义词,因此后者被认为是推荐的方式。

这里有一个简单的例子来说明它在实践中的含义:

#define TYPE_INT_PTR int*
typedef int *int_ptr;

int main(void)
{
    TYPE_INT_PTR p1 = 0, p2 = 0;
    int_ptr p3, p4;

    p3 = p1;
    p4 = p2; // error: assignment makes pointer from integer without a cast 

    return 0;
}

您可能认为p2 的类型是int*,但事实并非如此。预处理后的行是:

int* p1 = 0, p2 = 0;

另一方面,typedefp3p4 定义为指向int 的指针。

【讨论】:

    【解决方案2】:

    对于像您的示例这样的简单类型,它会起作用,尽管在将多个变量声明为与 Grzegorz Szpetkowski 所说的相同的语句时,它不会按预期工作。对于更复杂的情况,它可能根本不起作用,因为宏中的文本只是被盲目替换。

    例如用typedef声明一个函数指针:

    typedef int(*int_func)(int);
    func some_function_pointer;
    

    您不能使用像上面这样的简单宏,因为函数指针的语法不同,而且您还需要不同的宏来声明变量或强制转换。

    #define int_func_declaration(f) int(*f)(int)
    #define int_func_cast(f) ((int(*)(int))f)
    
    int_func_declaration(some_function_pointer) = int_func_cast(some_pointer_value);
    

    【讨论】:

    • 谢谢...它帮助了我
    【解决方案3】:

    你的程序中的错误是:

    1. #define 预处理器命令中不应有任何半列。
    2. *type* a,b; 行中键入后没有任何意义。如果你喜欢声明一个指针,那么你应该像这样声明type *a, b;
    3. 您忘记在代码开头包含 stdio.h 头文件

    Click here 获取更正后的代码。

    【讨论】:

    • 代码应该发布在答案/问题本身中,而不是在外部链接中。而且你的代码也是错误的。它使用 %d 来 printf sizeof 调用未定义的行为。 %zu must be used instead
    猜你喜欢
    • 2019-01-23
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多