2

我在 Linux 平台上用 C 语言编程。我想知道应该是声明的顺序和#defines在一个头文件中。

例如,如果我的头文件包含以下内容,任何人都可以建议我安排所有这些声明的完美顺序,如宏、外部声明等函数。

就可读性和编码标准而言,这对于在头文件中正确安排所有这些内容非常有益。

下面是示例头文件(我想按正确的顺序排列以下内容):

 #include <pthread.h>                   //  Including Header files 
 #include <signal.h>

 #define IMAGE_DIRECTORY                 "Abcdefgh..."   //  Providing #defines 
 #define FAILED_TO_RECOGNIZE             "Xykbkksk..."
 #define PROGRESS_FRAME_COLOR            "#8e8ea1"
 #define FRAME_BG_COLOR                  "#7c90ac"      

 #define PRINT_FUNCTION_NAME fprintf(stderr, 
                   "CTRL IN FUNCTION : %s\n",__func__);   // Macro like functions 
typedef struct {                                           
        int userId;                                      // Structure
         char name[32], rollNo[32];
         char class[16], section[16];
         unsigned long Id;
 }data_type;

int noOfUsersList=0, usersListCount=0;                   // Global variables 
4

3 回答 3

4

我已经很多年没有这样做了,但是当我同时为 Unix、MS.DOS、OS/2、NetWare 和 Windows 进行大量开发时,我开发了这种做法:

  1. 语言#包括
  2. 操作系统#includes
  3. #includes 来自其他子系统,例如 X11。
  4. 我自己的应用程序#includes。
  5. 我自己的本地#defines 用于此源文件。
  6. 我自己对此文件的前向声明。

也许你可以颠倒(1)和(2),但我发现这个顺序在相当多的编译器和操作系统中工作得最好。

于 2012-06-29T06:30:29.600 回答
1

编码风格是主观的,我个人使用下面描述的规则和方法,但请注意,这是我自己的观点,并非绝对真理。然而,它们基于长期经验,在某些情况下基于广泛认可的编码标准(MISRA、CERT 等)。

规则:

  • C 编程是在“代码模块”中完成的,其中每个模块都由一个 .h 文件和一个 .c 文件组成。
  • #includes 应始终位于 .h 文件中,而不应位于 .h 文件中,因为 .h 文件应被视为公共文件。您希望将要使用您的模块的人知道存在哪些依赖项。
  • 从来没有理由在 C 中使用非常量全局变量,因此在哪里放置非常量全局变量和外部变量与我无关。
  • .h 文件不应包含任何定义。这不仅是糟糕的程序设计,而且还是一个很好的方法来解决许多难以解决的链接器错误。

在 .h 文件中,允许按照规定的顺序出现以下项目:

  • 头球后卫开始。( #ifndef MYHEADER_H...)
  • 库#includes。
  • 其他#includes。
  • 特定于 Impl. 的编译器设置,例如使用 #pragmas 设置的编译器选项。
  • 公共数字常量为#defines。
  • 公共宏。
  • 公共类型定义,包括不透明类型。
  • 公共常量的声明(声​​明为extern const)。
  • 内联函数定义(罕见的特殊情况,尽可能避免)。
  • 函数原型。
  • 头球后卫结束。#endif

在 .c 文件中,允许按照规定的顺序出现以下项目:

  • 包含它自己对应的 .h 文件。
  • #defines 中的私有数字常量。
  • 私有宏。
  • 不透明类型的定义,在相应的 .h 文件中声明为不完整类型。
  • 私有类型定义。
  • 公共常量的定义(extern const在 .h 文件中声明)。
  • 私有常量的定义 ( static const)。
  • 在文件范围内定义私有变量 ( static)。
  • 私有函数的声明(声​​明为static type func (type param);
  • .h 文件中声明的公共函数的定义。
  • 私有函数的定义。
于 2012-06-29T08:05:14.160 回答
1

#define带有are not声明的宏定义。唯一的要求是宏应该在使用之前定义。它们保持定义直到编译单元结束,或显式#undef(或重新定义......)。

我的风格约定是将类似语句的宏定义为具有类似“函数”的语法,例如:

 #define PRINT_FUNCTION_NAME() fprintf(stderr, \
     "CTRL IN FUNCTION: %s @%s:%d\n", __func__, __FILE__, __LINE__)

注意空的形式宏参数(即 first ())和缺少终止分号(因为您将使用它作为准函数调用,例如PRINT_FUNCTION_NAME();语句)。还要注意 在调试消息中使用__FILE__ and 。__LINE__

很多时候,类似语句的宏是一个do{ 东西 } while(0),因为这是一种语法,它具有类似外观的语句,并且始终可以用作语句(包括作为 an 的then部分if,或 inelse分支等......)。一个例子<ncurses.h>

#define getsyx(y,x) do { if (newscr) { \
             if (is_leaveok(newscr)) \
            (y) = (x) = -1; \
             else \
             getyx(newscr,(y), (x)); \
        } \
        } while(0)
于 2012-06-29T05:58:24.830 回答