如何将 C 宏 (#define) 分离到 .h 和 .c 文件中

How to separate C macros (#define) onto .h and .c file

我通过示例书从 CUDA 获得了以下代码:

static void HandleError( cudaError_t err,
                     const char *file,
                     int line ) {
if (err != cudaSuccess) {
    printf( "%s in %s at line %d\n", cudaGetErrorString( err ),file, line );
    exit( EXIT_FAILURE );
}}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))


#define HANDLE_NULL( a ) {if (a == NULL) { \
                        printf( "Host memory failed in %s at line %d\n", \
                                __FILE__, __LINE__ ); \
                        exit( EXIT_FAILURE );}}

我想将它分成两个文件 .h 和 .c,如下所示:

#pragma once

#define HANDLE_ERROR
#define HANDLE_NULL

static void HandleError( cudaError_t err, const char *file, int line );

但我不知道如何分隔宏HANDLE_EROOR?

由于宏是预处理器如何执行文本替换的指令,因此不能将它们分成看起来像宏声明和宏定义(如函数)的东西。它们不是函数。

最好将整个宏放入 h 文件中。

只能拆分HandleError函数的定义,但这需要修改其对外部的链接(静态函数有内部链接且限于文件作用域):

book.h:

#pragma once

#include <stdio.h>
#include <stdlib.h>

#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))

#define HANDLE_NULL( a ) {if (a == NULL) { \
                            printf( "Host memory failed in %s at line %d\n", \
                                    __FILE__, __LINE__ ); \
                            exit( EXIT_FAILURE );}}

extern void HandleError( cudaError_t err, const char *file, int line );

book.c:

#include "book.h"

void HandleError( cudaError_t err, const char *file, int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}

HANDLE_ERRORHANDLE_NULL 宏明确移动到 .c 文件中没有多大意义,因为它们将在 public 视图之外,使它们 "dead"(因为它们不在那里使用)。

一般来说,宏在 C 语言的普通意义上不受 scopelinkage 的约束。这些只是可替换的标记,除非遇到文件结束,否则它们是可见的,但也可以通过 #undef 指令撤销。