C 中的宏在第一次和以后的调用中生成不同的代码

Macros in C that generate different code on the 1st and later calls

如何在 C 中定义宏,以便在头文件中的第一遍中使用“extern”关键字,然后在后续遍中初始化常量变量?我在 Windows 10 电脑上使用 Visual Studio 2022。

目前我的头文件中有类似以下的内容“images.h”

#pragma once

#include <stdio.h>
// Other #includes

typedef const unsigned char CBYTE;
typedef const int CINT;
// Other typedefs

#include "globals.h"
// Rest of the "images.h" header file.

然后在我的“globals.h”文件中有以下代码:

#ifndef _GLOBALS_H_
#define _GLOBALS_H_

extern CBYTE gc_eod16;
extern CINT gc_stf;

#else

CBYTE gc_eod16 = 127;
CINT gc_stf = 2;

#endif

然后在具有主要功能的文件“images.c”中,我有这样的东西:

#include "images.h"
#include "globals.h"

int main(void) {

    // Code in main

    return 0;
}

因为我有几个编译在一起的源文件,所以我需要使用“extern”关键字,并在其他文件的顶部添加#include“images.h”。

与其在主函数的文件中单独初始化全局常量,我想将它们与“extern”放在一起并在“globals.h”文件中初始化。这看起来编译正常,但是在“globals.h”文件中重复全局常量是不整洁的。

我的问题是,是否有一个宏,以便在第一次包含“globals.h”时,语句:

extern CBYTE gc_eod16;
extern CINT gc_stf;

被生成,然后在下一个 #include 中这些被替换为:

CBYTE gc_eod16 = 127;
CINT gc_stf = 2;

因此在源代码中每个变量都有一行,即第一个 #include "extern" 放在变量类型和名称之前,然后在第二个 #include "extern" 被省略,并且在变量之后附加字符串 "= 127; 等?

这是怎么做到的?如果知道,我将不胜感激。

没有

您希望 pre-processor 记住编译单元之间的事情。无法做到。

做个好邻居,在他们自己的 .cpp 文件中初始化变量。

现在,如果您仍然想以困难的方式做事,您可能想在编译和使用 DLL 时做一些类似于 windows 中所做的事情。

// globals.h

#ifndef BUILDING_GLOBALS
  extern CBYTE gc_eod16;
  extern CINT gc_stf;
#else
  CBYTE gc_eod16 = 127;
  CINT gc_stf = 2;
#endif

然后,您只需要修改一个 .cpp 文件,如下所示:

#define BUILDING_GLOBALS
#include "globals.h"

它的行为是这样的:

  • 每个没有定义 BUILDING_GLOBALS 的文件都会看到 extern 的东西。
  • 只有一个文件将定义 BUILDING_GLOBALS,该文件将进行初始化。