2014-10-30 77 views
-1

当我编译我的源代码打印你好从2014年使用当前年份,而不必编辑源代码。我考虑制作一个新的标题。我的来源是year.c,所以标题将是year.h如何修改指令处理器C

有没有办法让函数返回YEAR + 1?

有没有另一种方法呢?如果是这样,怎么样?我不知道如何制作头文件。

我的代码是

#include <stdio.h> 
#ifndef YEAR 
    #define YEAR "2013" 
#endif 

int main() { 
    printf("Hello from" YEAR); return 0; 
} 
+2

我想你要找的是:将'YEAR'定义为整数而不是字符串,然后你可以使用'+'运算符:'#define YEAR 2013'。在'printf()'你应该做'printf(“你好从%d”,YEAR + 1);'因为它不再是一个字符串字面值,你可以连接 – Jack 2014-10-30 17:24:08

+2

如果你想嵌入日期/年源代码已编译,请查看标准'__DATE__'宏(https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html)。 – 2014-10-30 17:30:09

+0

我想要打印2014年,而不是年+ 1,对不起 – 2014-10-30 17:40:24

回答

3

你可以,也predefine a macro在编译时参数传递到编译器,像这样:

-D name=definition 

如果您使用的是GCC,您可以像这样编译您的代码:

gcc -D YEAR=2014 myProgram.c -o myProgram 

这样,您可以在编译时完全控制宏,而无需更改代码。该选项对处理调试信息非常有用。

请注意,此宏是在对源文件进行预处理之前定义的,因此在您的代码到达#ifndef YEAR时,将会有一个名为YEAR的宏。


此外,还应该更新您的printf()调用此:

printf("Hello from %d", YEAR); 

因为YEAR被认为是一个数字小值,而不是一个字符串。

+0

它说这是一个错误 – 2014-10-30 17:41:59

+0

什么是错误信息? – streppel 2014-10-30 17:42:50

+0

year.c:8:30:note:扩展宏'年'printf(Bla bla); – 2014-10-30 17:42:57

1

同比可以重新定义一个宏,以这样的方式

#ifdef YEAR 
    #undef YEAR // This line destroys the "old" definition of YEAR 
#endif 

#define YEAR "2014" 
2

我不知道如何制作头文件。

要使用头文件,只需使用#include即可引用它。

在您的例子,在你的文件year.c只需添加:

#include "year.h" 

那么很明显,创建具有相应内容的文本文件text.h

一个推荐的做法,虽然不是必需的,但是使用头文件“包装器”来防止重复读取头文件(浪费时间重新处理同一文件),这对大型项目是最有利的,复杂的相互依赖性使得多次间接包含相同的头文件变得容易。

例子:

/* year.h - Documentation */ 

#ifndef YEAR_H 
#defined YEAR_H 
... 
/* header file's 'actual' content */ 
#define CURRENT_YEAR "2014" 
... 
#endif 
/* ifndef YEAR_H */ 

当我编译我的源代码使用当年从2014年起打印你好,而无需修改源代码。

有多种方法来实现这一点,我会展示一种这样的方式。在标准C(C89/90,C99或C11)中,编译器(或其预处理器)将自动生成一个包含年份在内的日期的字符串的宏定义__DATE__

您可以编写一个函数来解析此字符串以仅返回年份,作为整数值。

#include <string.h> 
#include <stdlib.h> 

int get_year_compiled(void) { 
    char* date = __DATE__; 
    char *year; 

    year = date + strlen(date) - 4; /* Pointer arithmetic for fun and profit */ 
    return atoi(year); 
} 

有没有一种方法,使返回YEAR + 1的功能?

这可以很容易地完成作为前一个问题的扩展。

荣获@ Andrew-Medico首次提及__DATE__