#include需要比程序中显示的更快

时间:2016-04-06 19:32:38

标签: c include c-preprocessor

如果定义了DEBUG,我有一个标题,其中一个函数声明。

此外,我对此功能的定义具有相同的原理。但是我会知道在参数检查后是否仅在DEBUG中定义了main()

我已将#include放入main()

标题

#ifdef DEBUG
void printStack(Stack* st);
#endif

文件,其中函数定义为

#ifdef DEBUG
void printStack(Stack* st)
{
    int i;
    for (i = 0; i < st->size; i++)
        printf(ValType_IOSPECIF " ",st->data[i]);
    printf("\n");
}
#endif

文件,其中main()

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "calculating.h"

#define EXPR_LENGTH 1000

int main(int argc, char* argv[])
{
    int argflag = 0;
    if (argc >= 2)
        argflag = !strcmp(argv[1], "-debug");

#if (argflag)
#define DEBUG
    printf("! DEBUG !\n\n\n")
#endif

#include "stack.h" // there is a that function here
...
}

是不是?

3 个答案:

答案 0 :(得分:4)

  

但是我知道在参数检查之后是否只将DEBUG定义为main()。

     

...

     

是不是?

不,那不对。

DEBUG是在编译每个源文件时在编译时定义或不定义的预处理器宏。在编译DEBUG时可能会定义main.c,而在编译定义printStack的源文件时则不会定义{。}}。

如果您使用make或IDE,很可能是DEBUG是否已定义用于编译每个源文件,但语言中没有任何内容可以保证这一点。

答案 1 :(得分:4)

您对C和预处理器宏感到困惑:

在编译源代码之前,所有以#开头的内容都被预处理器替换,并且只有在运行时才执行main

所以,不,你做得不对。

在运行时你不能#define#if;这是一个预编译时间的事情。只需使用C的常规变量和if控制机制。

你的错误强烈指向你没有通过一个连贯的教程或C书来学习语言。也许你想要学习新文学;我能想象的任何C教程都会教你如何快速完成这项工作。

答案 2 :(得分:0)

不,那是错的。你试图根据传递的参数确定预处理的结果。以下是代码的简化版本:

#define EXPR_LENGTH 1000

int main(int argc, char* argv[])
{
    int argflag = 0;
    if (argc >= 2)
        argflag = !strcmp(argv[1], "-debug");

#if (argflag)
#define DEBUG
    printf("! DEBUG !\n\n\n")
#endif
}

使用clang -E main.c进行预处理:

int main(int argc, char* argv[])
{
 int argflag = 0;
 if (argc >= 2)
  argflag = !strcmp(argv[1], "-debug");





}

Pre 进程在编译之前完成,这是在执行之前启动的。因此,无法在运行时确定预处理的结果。