gpt4 book ai didi

c++ - 两个文件中相同函数/全局变量的不同声明

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:03 24 4
gpt4 key购买 nike

在 C 和 C++ 的情况下,我有 2 个关于相同函数和全局变量在两个文件中的不同声明的问题。

  1. 不同的函数声明

    考虑以下代码片段:

    file_1.c

    void foo(int a);

    int main(void)
    {
    foo('A');
    }

    file_2.c

    #include <stdio.h>

    void foo(char a)
    {
    printf("%c", a); //prints 'A' (gcc)
    }

    正如我们所见,原型(prototype)不同于位于file_2.c,但是,该函数打印预期值。

    如果涉及到C++,上面的程序由于undefined而无效在链接时引用 foo(int)。这可能是由存在其他函数签名 - 与 C 相比,其中函数名称不包含任何额外的字符表明函数参数的类型。

    但是当涉及到 C 时呢?由于具有相同的原型(prototype)无论参数的数量如何,名称都具有相同的签名及其类型,链接器不会发出错误。但是哪种类型转换在这里进行?它看起来像这样吗:'A' ->int -> 返回 char?或者也许这种行为是未定义/实现定义?

  2. 全局变量的不同声明

    我们有两个文件和相同的两个不同声明全局变量:

    file_1.c

    #include <stdio.h>

    extern int a;

    int main(void)
    {
    printf("%d", a); //prints 65 (g++ and gcc)
    }

    file_2.c

    char a = 'A';

    在 C 和 C++ 中,输出都是 65。

    虽然我想知道这两种标准对那种情况。

    在 C11 标准中,我发现了以下片段:

    J.5.11 Multiple external definitions (Annex J.5 Common extensions)
    There may be more than one external definition for the identifier of an object, with or without the explicit use of the keyword extern; if the definitions disagree, or more than one is initialized, the behavior is undefined (6.9.2).

    请注意,它指的是两个或多个定义的存在,在我的代码只有一个,所以我不确定这篇文章是否是一个很好的引用点这种情况...

最佳答案

Q1。根据 C99 规范,第 6.5.2.2.9 节,它是 C 中的未定义行为:

If the function is defined with a type that is not compatible with the type (of the expression) pointed to by the expression that denotes the called function, the behavior is undefined.

表达式“指向”采用 int 的函数,而该函数被定义为采用 char

Q2。变量的情况也是未定义的行为,因为您正在读取或分配一个 int 到/从 char。假设是 4 字节整数,这将访问超过有效内存位置的三个字节。您可以通过声明更多变量来测试它,如下所示:

char a = 'A';
char b = 'B';
char c = 'C';
char d = 'D';

关于c++ - 两个文件中相同函数/全局变量的不同声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12140820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com