首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言实现冗长

问用C语言实现冗长
EN

Stack Overflow用户
提问于 2016-03-18 23:27:18
回答 1查看 9K关注 0票数 3

我正在实现一个详细的模式。下面是我要做的:定义一个全局变量详细(以verose.h),这样需要详细的文件只需要包含该文件。例如:

逐字。h:

代码语言:javascript
复制
void setVerbose(int test);

逐字c:

代码语言:javascript
复制
#include "verbose.h"

// define VERBOSE if called
void setVerbose(int test) {
    if (test) {
        #ifndef VERBOSE
        #define VERBOSE
        #endif
    }
}

要点h:

代码语言:javascript
复制
typedef struct Point Point;
struct Point {
    int x, y;
};

void printPoint(Point *point);

要点c:

代码语言:javascript
复制
#include "point.h"
#include "verbose.h"

void printPoint(Point *point) {
    #ifdef VERBOSE
        printf("My abscissa is %d\n", point->x);
        printf("My ordinate is %d\n", point->y);
    #endif

    printf("[x,y] = [%d, %d]\n", point->x, point->y);
}

主要是:

C.主要:

代码语言:javascript
复制
#include "verbose.h"
#include "point.h"

int main(int argc, char *argv[]) {
    if (argc >= 2 && !strcmp(argv[1], "-v"))
        setVerbose(1);

    Point *p = init_point(5,7);
    printPoint(p);

    return 0;
}

可执行文件的生成有:

代码语言:javascript
复制
$ gcc -o test main.c point.c verbose.c

所需的产出如下:

代码语言:javascript
复制
$ ./test
    [x,y] = [5, 7]

$ ./test -v
    My abscissa is 5
    My ordinate is 7
    [x,y] = [5, 7]

问题是,在调用printPoint()时,似乎没有在point.c中定义详细内容。

EN

回答 1

Stack Overflow用户

发布于 2016-03-18 23:40:45

预处理器命令是在编译时决定的,而不是在运行时决定的,因此您的系统将无法工作。相反,我建议使用全局bool Verbose并提供一个verbose()函数来完成打印(或不打印)。

verose.h

代码语言:javascript
复制
#include <stdbool.h>

int verbose(const char * restrict, ...);
void setVerbose(bool);

verose.c

代码语言:javascript
复制
#include "verbose.h"
#include <stdbool.h>
#include <stdarg.h>
#include <stdio.h>

bool Verbose = false;

void setVerbose(bool setting) {
    Verbose = setting;
}

int verbose(const char * restrict format, ...) {
    if( !Verbose )
        return 0;

    va_list args;
    va_start(args, format);
    int ret = vprintf(format, args);
    va_end(args);

    return ret;
}

main.c

代码语言:javascript
复制
#include "verbose.h"
#include <stdbool.h>

int main() {
    verbose("Verbose is off\n");

    setVerbose(true);

    verbose("Verbose is on\n");

    int foo = 42;

    verbose("Number: %d\n", foo);

    return 0;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36095915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档