Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 预处理器定义与函数原型的使用_C_C Preprocessor_User Defined Functions - Fatal编程技术网

C 预处理器定义与函数原型的使用

C 预处理器定义与函数原型的使用,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指令保护

我正在考虑添加一个define,以避免双重声明,但有人告诉我,define定义和函数名使用相同的名称是不好的做法

acg_头.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