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

时间:2015-02-18 00:18:02

标签: c macros c-preprocessor

我通过示例书从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?

2 个答案:

答案 0 :(得分:3)

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

整个宏应该优先进入h文件。

答案 1 :(得分:1)

您只能拆分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文件中没有多大意义,因为它们将不在公共视图范围内,使得它们#34;死了&# 34; (因为它们不在那里使用)。

通常,宏在C语言的普通意义上不受范围链接的约束。这些只是可替换的令牌,除非遇到文件结尾,否则是可见的,但#undef指令也可以撤销它。