1

DD应该怎么做?

如果

#define HEADING_TITLE_PROJECT_NAME  "<= Version Maintenance Based On Compiled DateTime =>"
#define SIZE_OF_HEADER_FOR_DECORATION_PURPOSE sizeof(HEADING_TITLE_PROJECT_NAME)
#define DD ????
#define HEADING "\r\n"DD"\r\n"HEADING_TITLE_PROJECT_NAME"\r\n"DD"\r\n"

我想得到HEADING字符串文字如下:

<==================================================>
<= Version Maintenance Based On Compiled DateTime =>
<==================================================>

= 符号或我曾经放置的任何内容将在 <== ... ==> 中重复以填充HEADING_TITLE_PROJECT_NAME空间。

可以这样或其他方式完成。 我只想在编码时间更改 HEADING_TITLE_PROJECT_NAME 而没有别的。 只是想如果可以做到:)

<==编辑开始==> 类似的东西

#define DD\
 char * get()\
{\
    char arr[100] = '\0';\
    for (int i=0; i < SIZE_OF_HEADER_FOR_DECORATION_PURPOSE - 1; i++)\
    {\
        arr[i] = "=";\
    }\  
    return arr;\
}

<==编辑结束==>

4

3 回答 3

3

不幸的是,在标准 C 预处理器中没有自动生成的方法DD,只要您想以在HEADING宏定义中使用的方式使用它。

只要您坚持HEADING按照当前定义的方式进行定义,我只能建议使用半自动方法:)。DD手动、明确地定义。

#define HEADING_TITLE_PROJECT_NAME "<= Version Maintenance Based On Compiled DateTime =>"
#define DD                         "<==================================================>"

然后只需添加

STATIC_ASSERT(sizeof HEADING_TITLE_PROJECT_NAME == sizeof DD);

就在它下面(使用你最喜欢的 实现STATIC_ASSERT)。这样,任何DD长度的差异都会立即触发错误并迫使开发人员更新DD.

于 2011-08-26T17:12:11.810 回答
0

这是不可能的,因为 sizeof 是在预处理器之后而不是之前评估的。

如果你事先知道字符串的长度,那就是。

因为预处理器没有任何循环结构,所以您最终会创建它们。Boost 是这样的

#define REPEAT_TIMES(macro, n) REPEAT##n(macro)
#define REPEAT1(macro) MACRO
#define REPEAT2(macro) REPEAT1(macro)MACRO
#define REPEAT3(macro) REPEAT2(macro)MACRO
....

然后你会简单地:

#define FILLER "="
#define DD "<"REPEAT_TIMES(FILLER, 34)">"
于 2011-08-27T00:30:06.077 回答
-1

您的实现DD不是一个坏主意,尽管它存在一些糟糕的语法和未定义的行为。

const char *DDD(void)
{
    static char arr[] = HEADING_TITLE_PROJECT_NAME;
    if(arr[2] == ' ')
        for(size_t i = 2; i + 3 < sizeof arr; i++)
            arr[i] = '=';
    return arr;
}
#define DD DDD()

您不能返回指向堆栈数据的指针,因此您必须使用static数组。我们可以通过将它自动设置为 d 字符串来确保它的大小正确#define,然后检查它是否已经被填充'=',如果没有,则填充它。然后我们返回一个const指向它的指针,这样就没有人试图修改它了。

您的宏定义了一个函数 ,get具有未指定的参数,并返回一个可修改char *的堆栈数据。不幸的是,这个函数将在您使用宏的任何地方定义,这将导致许多多重定义错误。

您不能将它与原始字符串连接一起使用,但它适用于您想要的所有其他内容。

于 2011-08-26T17:43:47.867 回答