C 预处理器定义与函数原型的使用
我必须处理两个头文件,它们用不同的类型名声明相同的原型(注意,最后这两种类型是相同的) 其中一个受#ifndef指令保护 我正在考虑添加一个define,以避免双重声明,但有人告诉我,define定义和函数名使用相同的名称是不好的做法 acg_头.hC 预处理器定义与函数原型的使用,c,c-preprocessor,user-defined-functions,C,C Preprocessor,User Defined Functions,我必须处理两个头文件,它们用不同的类型名声明相同的原型(注意,最后这两种类型是相同的) 其中一个受#ifndef指令保护 我正在考虑添加一个define,以避免双重声明,但有人告诉我,define定义和函数名使用相同的名称是不好的做法 acg_头.h #ifndef ACos /* MATH::ACos/ */ extern T_Float_user ACos(/* X/ */ T_Float_user X); #endif /* ACos */ 手动_头.h
#ifndef ACos
/* MATH::ACos/ */
extern T_Float_user ACos(/* X/ */ T_Float_user X);
#endif /* ACos */
手动_头.h
#define ACos // suggested modification
extern t_float ACos(const t_float X);
我想知道关于C实现,is是否是一个正确的解决方案。对于同一个函数或对象,您可以有任意数量的兼容声明。为了避免这种情况,没有必要也没有必要玩预处理器游戏。这就是为什么标准方法适用于在(一)个头文件中声明的每个函数或全局变量,以及访问或定义任何函数或对象以包含适当头文件的每个源。那么关于 我必须处理两个头文件,它们用不同的类型名声明相同的原型 ,不,你不应该处理这个问题。每个函数应该只有一个声明头。尽管如此,如果您有两个,并且它们以兼容的方式声明函数,那么您仍然没有问题,即使由于使用了不同但兼容的类型别名,声明在词汇上不匹配 另一方面,如果您的两个头文件中的声明彼此不兼容,那么您就有一个更深层次的问题。它们中最多有一个可以与函数定义兼容,并且不能使用其他任何函数 我正在考虑添加一个define,以避免双重声明,但有人告诉我,define定义和函数名使用相同的名称是不好的做法 同样,最好跳过整个练习,但如果选择继续,则需要了解范围内宏标识符在代码中的外观将替换为宏定义。因此,预处理的结果如下: 会是
extern t_float (const t_float X);
,因为您已将ACos
定义为扩展为空序列。预处理的结果无效。如果必须遵循此路径,请定义宏以扩展到其自己的名称:
#define ACos ACos
然后可以通过
#ifdef
指令对其进行测试,但可以避免预处理器损坏程序。但是,真的,不要这样做。“我必须处理两个头文件,它们用不同的类型名声明相同的原型(注意,最后两种类型是相同的)”:这首先是一个非常糟糕的设计。#ifndef
是一个预处理器指令,而不是pragma。pragma是一种不同的、特定类型的预处理器指令。如果这两种类型在声明中不相同,那么这两种类型最后怎么可能是相同的呢?为了让编译器处理外部T_Float_用户ACos(T_Float_用户X)
,T\u Float\u user
必须已定义(使用typedef
,这使其成为某些类型的别名)。类似地,为了让编译器处理extern t_float Acos(const t_float X)代码>,t\u float
必须已定义。如果它们是同一类型的不同名称,则没有错误;这应该编译并运行(在没有其他问题的情况下)。如果它们是不同的类型,则它们是不同的,不能使它们相同。typedef
不会创建新类型。它只创建类型的同义词。因此,如果一个标题具有typedef struct foo T_Float_user
,而另一个标题具有typedef struct foo T_Float
,则T_Float_user
和T_Float
是相同的类型(前提是struct foo
在这两个标题中声明相同)。类型名称与结构名称不同,在结构名称中,不同的结构标记创建不同的类型,即使结构内容相同。也就是说,manual_header.h可能没有理由重新声明acg_header.h中声明的类型或函数。很可能它应该只包括acg_header.h。关于“我必须处理两个头文件,它们用不同的类型名声明相同的原型”——为什么?是什么让你这么做的?为什么两个头必须用不同的类型名声明相同的原型?
#define ACos ACos