花了亿点点时间,写了一个赶海和茶艺小程序:探索多重功能,开启精彩互动之旅!

Posted 飘逸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了花了亿点点时间,写了一个赶海和茶艺小程序:探索多重功能,开启精彩互动之旅!相关的知识,希望对你有一定的参考价值。

在繁忙的生活中,我们常常渴望找到一个灵感迸发、充满艺术与智慧的休憩之所。幸运的是,经过小编没日没夜的奋斗,赶海和茶艺小程序应运而生,为您带来一系列令人惊喜的功能,让您尽情享受多重体验。

赶海和茶艺小程序融合了多种功能,带给您全方位的娱乐、学习和创作体验。无论是积累功德、获取每日推送的精彩内容,还是发挥创造力进行AI绘画、与AI聊天,探索经典语录和诗歌问答,定制节日头像,追踪今日热搜,以及成为打工举牌人的生成照片,您都能在这里找到自己的兴趣所在。赶海和茶艺,与您一同开启一段多彩而有趣的互动之旅!尽情探索创意的无限可能吧!

小编接下里小程序介绍相关功能

1.功德值

在这个快节奏的社会中,关爱他人和社区变得格外重要。通过赶海和茶艺,您可以通过敲打木鱼积累功德值。

2.每日推送

每天都有新的惊喜等待着您!我们精心挑选与您兴趣相符的内容,包括今日天气、心灵鸡汤、舔狗日记、历史上的今天等,为您带来丰富的知识和娱乐,让您的每一天都过得更加充实与有趣。

3. AI绘画

释放内心的创造力,让AI成为您的艺术搭档!通过赶海和茶艺的AI绘画功能,您可以探索无限的绘画可能,创作属于自己独一无二的艺术作品,尽情展现个性与才华。

4. AI聊天

寻找一段有趣的对话?AI聊天功能将为您提供绝佳的伴侣!与人工智能交流,探讨各种话题,获取智慧与娱乐的双重享受,带给您别样的交流体验。

5.打工举牌人生成照片

让您的想象力翱翔,与打工举牌人一同畅游!赶海和茶艺提供打工举牌人生成照片功能,让您尽情体验成为独特举牌人的乐趣。通过AI技术,将您的照片与各种有趣的举牌标语相结合,创造出个性化的打工举牌人形象。与朋友分享这些有趣的照片,营造欢乐的氛围,让大家一同感受创意的力量。

6.经典语录

从名人名言到智者箴言,我们精选经典语录,为您带来灵感的火花。无论是心灵鸡汤还是智慧启迪,每一句话都将点燃您内心的激情,让您更加坚定地追寻自己的梦想与目标。

7.诗歌问答

在诗意的世界里畅游!通过诗歌问答功能,您可以测试自己对诗歌的了解与品味。参与互动,领略文学之美,挑战您的诗词造诣,让文学成为您生活的一部分。

8.节日头像制作

每个节日都有独特的氛围和庆祝方式。通过赶海和茶艺,您可以定制属于自己的节日头像,展现节日的喜庆和个性。选择各种元素和装饰,让您的头像焕发节日的色彩,与亲朋好友一同分享喜悦与祝福。

9.今日热搜:

掌握时下热门话题,了解世界的脉动。赶海和茶艺为您提供今日热搜功能,让您随时了解社会热点、娱乐八卦、科技趋势等各个领域的最新动态,让您保持与时俱进的资讯触角。

赶海和茶艺小程序融合了多种功能,带给您全方位的娱乐、学习和创作体验。无论是积累功德、获取每日推送的精彩内容,还是发挥创造力进行AI绘画和与AI聊天,或是探索经典语录和诗歌问答,以及定制节日头像和追踪今日热搜,您都能在这里找到自己的兴趣所在。赶海和茶艺,与您一同开启一段多彩而有趣的互动之旅!

小编目前由于没有新颖的点子,暂时没有更多的功能了,后续还会继续更新更多有趣的功能,如果大伙有新颖的点子,欢迎在评论区留言,拜谢!

多重定义和第一次在我的 C 程序中定义

【中文标题】多重定义和第一次在我的 C 程序中定义【英文标题】:Multiple definition and first defined in my C program 【发布时间】:2012-04-05 14:02:59 【问题描述】:

我正在阅读 APUE(Stevens 的“Advanced Programming in the UNIX Environment”),所以有一个文件“apue.h”,其中包含一些声明的自定义函数。我写了一个名为“wait.c”的文件,它定义了在“apue.h”中声明的函数WAIT_CHILDWAIT_PARENT,主函数是14.6.c。

tmp/cciYhMd7.o: In function `err_ret':
14.6.c:(.text+0x0): multiple definition of `err_ret'
/tmp/ccO4WyJS.o:wait.c:(.text+0x0): first defined here

err_ret只是使用了没有定义,有什么问题吗??

等待.c

#include "apue.h"

static volatile sig_atomic_t sigflag;
static sigset_t newmask, oldmask, zeromask;

static void
sig_usr(int signo)

    sigflag = 1;


void
TELL_WAIT(void)

    if(signal(SIGUSR1, sig_usr) == SIG_ERR)
      err_sys("signal(SIGUSR1) error");
    if(signal(SIGUSR2, sig_usr) == SIG_ERR)
      err_sys("signal(SIGUSR2) error");

    sigemptyset(&zeromask);
    sigemptyset(&newmask);

    sigaddset(&newmask, SIGUSR1);
    sigaddset(&newmask, SIGUSR2);

    if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
      err_sys("SIG_BLOCK error");


void
TELL_PARENT(pid_t pid)

    kill(pid, SIGUSR2);


void
WAIT_PARENT(void)

    while(sigflag == 0)
      sigsuspend(&zeromask);
    sigflag = 0;

    if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
      err_sys("SIG_SETMASK error");


void
TELL_CHILD(pid_t pid)

    kill(pid, SIGUSR2);


void
WAIT_CHILD(void)

    while(sigflag == 0)
      sigsuspend(&zeromask);
    sigflag = 0;

    if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
      err_sys("SIG_SETMASK error");

上面的代码是我的“wait.c”源文件。我只使用err_sys。以下是我得到的链接命令行和链接器错误消息:

$ gcc -o a.out wait.c 14.6.c
/tmp/ccZ5F3Pn.o: In function `err_ret':
14.6.c:(.text+0x0): multiple definition of `err_ret'
/tmp/cc5EXGbf.o:wait.c:(.text+0x0): first defined here
/tmp/ccZ5F3Pn.o: In function `err_sys':
14.6.c:(.text+0x38): multiple definition of `err_sys'
/tmp/cc5EXGbf.o:wait.c:(.text+0x38): first defined here
/tmp/ccZ5F3Pn.o: In function `err_exit':
14.6.c:(.text+0x76): multiple definition of `err_exit'
/tmp/cc5EXGbf.o:wait.c:(.text+0x76): first defined here
/tmp/ccZ5F3Pn.o: In function `err_dump':
14.6.c:(.text+0xaf): multiple definition of `err_dump'
/tmp/cc5EXGbf.o:wait.c:(.text+0xaf): first defined here
/tmp/ccZ5F3Pn.o: In function `err_msg':
14.6.c:(.text+0xe6): multiple definition of `err_msg'
/tmp/cc5EXGbf.o:wait.c:(.text+0xe6): first defined here
/tmp/ccZ5F3Pn.o: In function `err_quit':
14.6.c:(.text+0x116): multiple definition of `err_quit'
/tmp/cc5EXGbf.o:wait.c:(.text+0x116): first defined here
/tmp/ccZ5F3Pn.o: In function `TELL_WAIT':
14.6.c:(.text+0x5fe): multiple definition of `TELL_WAIT'
/tmp/cc5EXGbf.o:wait.c:(.text+0x272): first defined here
/tmp/ccZ5F3Pn.o: In function `TELL_CHILD':
14.6.c:(.text+0x72e): multiple definition of `TELL_CHILD'
/tmp/cc5EXGbf.o:wait.c:(.text+0x3a2): first defined here
/tmp/ccZ5F3Pn.o: In function `WAIT_PARENT':
14.6.c:(.text+0x6d8): multiple definition of `WAIT_PARENT'
/tmp/cc5EXGbf.o:wait.c:(.text+0x34c): first defined here
/tmp/ccZ5F3Pn.o: In function `TELL_PARENT':
14.6.c:(.text+0x6bd): multiple definition of `TELL_PARENT'
/tmp/cc5EXGbf.o:wait.c:(.text+0x331): first defined here
/tmp/ccZ5F3Pn.o: In function `WAIT_CHILD':
14.6.c:(.text+0x749): multiple definition of `WAIT_CHILD'
/tmp/cc5EXGbf.o:wait.c:(.text+0x3bd): first defined here
collect2: ld returned 1 exit status

【问题讨论】:

你能告诉我们你的声明和定义部分吗? 问题是函数err_ret存在于其他源文件中,我只是在我的wait.c源文件中使用它。帮帮我! 好的。但是告诉我们你是如何使用它的? 请看我的声明,先谢谢。 向我们展示您的所有代码如何? 【参考方案1】:

不要在头文件中定义函数或变量。在头文件中声明它们,在 .c 源文件中定义它们。

您需要为定义创建一个单独的源文件并单独编译它。

另外,请注意声明全局变量和定义之间的区别。如果你需要声明一个被多个.c文件使用的变量,你必须说:

extern int err__ret;

在头文件中声明变量(作为外部变量),然后添加:

int err_ret;

到一个 .c 文件,定义它。

另请注意,任何定义变量或函数的 .c 文件还应包含声明它的 .h 文件。如果声明和定义之间存在任何差异,这将导致编译器产生错误。

【讨论】:

是的,我的头文件中没有定义函数,所以不知道是什么问题! 在 "apue.h" 中有很多函数声明如err_ret, WAIT_CHILD,其实err_ret是别人写的,我在我的"wait.c"源码中完成WAIT_CHILD文件。【参考方案2】:

APUE 书籍网站的来源在apue.h 中有这三个声明(以及许多其他声明):

void    err_ret(const char *, ...);

void    WAIT_PARENT(void);
void    WAIT_CHILD(void);

从编译器的错误信息来看,不仅定义了err_ret(),实际上还定义了两次,一次在源文件wait.c 中,一次在源文件14.6.c 中。您将需要确定这些定义中的哪一个(如果有的话)是正确的,然后删除另一个,或者决定您不能将wait.c 中的代码与14.6.c 中的程序一起使用。将err_ret() 和朋友放在他们自己的源文件中可能会更好。在源代码中,err_*() 函数在 lib/error.c 中。


我没有重新定义函数err_*(),所以我想我使用lib/error.c 源文件。在apue.h 中有:

#ifndef _APUE_H
#define _APUE_H

所以我认为它不会定义两次。

如果您的 TU(翻译单元)使用 #include "lib/error.c",那么您的 TU 正在定义功能。 C 编译器会看到包含您的源代码的源代码以及您包含的标头以及(假设地)lib/error.c 中的代码。您根本不应该包含该源文件;您应该单独编译它并将目标文件链接到您的程序中。 apue.h 标头声明了 err_*() 函数,因此您可以在代码中使用它们。您需要单独编译 lib/error.c 并将其与您的 wait.o14.6.o 文件链接。

理解定义变量或函数(实际上是为其分配存储空间)和声明变量或函数(告诉编译器该函数或变量存在,但此处未定义)之间的区别至关重要——如在“这个声明没有定义它”中,即使源文件中的下一行确实定义了它)。标头应提供声明,而不应提供定义(大多数情况下——目前这是一条足够好的规则,直到您知道何时以及如何打破规则为止)。


但是当我编写源文件时,我所做的只是#include "apue.h"。我不太明白如何单独编译lib/error.c

所以,听起来您的编译和链接行中需要三个源文件:

gcc -o 14.6 14.6.c wait.c lib/error.c

或者您可以在单独的操作中进行:

gcc -c 14.6.c
gcc -c wait.c
gcc -c lib/error.c -o error.o
gcc -o 14.6 14.6.o wait.o error.o

您可能需要额外的编译器标志(例如-I-D 选项),或额外的库和链接器选项(例如-llib-L /directory/lib 选项)。

如果您的源文件 14.6.c 和 wait.c 包含 #include "apue.h" 并且不包含其他源文件(所以没有 #include "lib/error.c" 或类似的东西 - 并且 14.6.c 不包含您的 wait.c 反之亦然) ,那么您应该不会遇到问题。

但是,您遇到了问题,我们看不到您的源代码或链接命令,这意味着我们必须尝试并猜测您做错了什么。我们可以设计各种奇怪的例子来说明你可能在做什么,但我们很可能是错的。

所以,尽量减少代码,向我们展示您正在编译哪些文件以及如何编译它们。

【讨论】:

其实err_*()的函数我并没有重新定义,所以我想我使用lib/error.c的源文件。而在aoue.h#ifndef _APUE_H #define _APUE_H ,所以我认为它不会定义两次。 如果您的 TU(翻译单元)使用 #include "lib/error.c",那么您的 TU 正在定义功能。 C 编译器会看到包含您的源代码的源代码以及您包含的标头以及(假设地)lib/error.c 中的代码。您根本不应该包含该源文件;您应该单独编译它并将目标文件链接到您的程序中。 apue.h 声明了 err_*() 函数,因此您可以在代码中使用它们。您需要单独编译 lib/error.c 并将其与您的 wait.o14.6.o 文件链接。 但是我做的只是#include "apue.h",当我写我的源文件时,我不太明白如何单独编译lib/error.c 我想再次遵守apue.h 你并没有真正“编译”apue.h;你用它编译。 C 代码文件包括 apue.h 以获取声明,这允许代码使用函数。但是您还必须为函数提供定义,为此,您需要编译包含函数的源文件。【参考方案3】:

请显示 wait.h 的 err_ret() 条目,如果需要,可以隐藏其他行。没有人要求您妥协您的 NDA :)(双关语)。你也有在wait.c 中再次声明err_ret() 吗?如果你有那么它不会编译。(我猜这就是问题所在)

首先进行预处理以找到多个定义,如下所示:

$gcc -E wait.c | grep -n 'err_ret'
$gcc -E 14.6.c | grep -n 'err_ret'

查看输出和行号,找出函数声明和定义的确切位置。

【讨论】:

对不起,我不明白你的意思。帮帮我!【参考方案4】:

我在编译 sigsetjmp.c 时遇到了类似的问题。最后我发现原因是我的apue.h中有#include "error.c",导致编译多个c文件时,每个文件都包含apue.h,然后又包含error.c,导致多重定义err_ret错误.

这是我的建议:

    不要在头文件(apue.h)中包含任何函数定义 c 文件。

    gcc 命令行或 Makefile 中需要的其他 c 文件就可以了。

    例如:gcc sigsetjmp.c pr_mask.c error.c

希望对您有所帮助。

【讨论】:

以上是关于花了亿点点时间,写了一个赶海和茶艺小程序:探索多重功能,开启精彩互动之旅!的主要内容,如果未能解决你的问题,请参考以下文章

云原生快出数量级的性能是怎样炼成的?就提升了亿点点

⚡三十分钟⚡小白写了一个坦克大战无敌版(找素材又花了半个小时/尴尬)

2019国庆期间赶海体验

2019北京文博会/茶艺文化展

一套代码小程序&Web&Native运行的探索01

如何快速开发一个古诗词小程序