标签: c-standard-library

"'getenv':这个函数或变量可能不安全." - 真的吗?

我正在使用MSVC来编译一些C代码,这些代码使用标准库函数,例如和其他函数getenv(),sprintf/W3设置了警告.MSVC告诉我:

'getenv':此函数或变量可能不安全.请考虑使用_dupenv_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS

问题:

  • 从理论上讲,为什么这会不安全 - 而不是在其他平台上使用?
  • 在实践中,它在Windows上不安全吗?
  • 假设我没有编写面向安全的代码 - 我应该禁用此警告还是实际开始别名一堆标准库函数?

crt compiler-warnings visual-c++ getenv c-standard-library

5
推荐指数
1
解决办法
3414
查看次数

为什么没有"unsigned wchar_t"和"signed wchar_t"类型?

char的签名不是标准化的.因此有signed charunsigned char类型.因此,使用单个字符的函数必须使用可以包含signed char和unsigned char的参数类型(此类型被选择为int),因为如果参数类型是char,我们将从编译器获取类型转换警告(如果-Wconversion在这样的代码中使用):

char c = 'ÿ';
if (islower((unsigned char) c)) ...

warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
Run Code Online (Sandbox Code Playgroud)

(这里我们考虑如果islower()的参数类型为char会发生什么)

而没有明确的类型转换使其工作的事情是自动升级charint.

此外,wchar_t引入的ISO C90标准没有说明任何具体的表示wchar_t.

glibc引用的一些引用:

定义wchar_t为合法是合理的char

如果wchar_t定义为必须定义char类型wint_t,则int由于参数提升.

因此,wchar_t可以很好地定义为char,这意味着必须应用宽字符类型的类似规则,即,可能存在wchar_t积极的实现 ,并且可能存在wchar_t否定的实现.由此可以得出必须存在unsigned wchar_tsigned wchar_t类型(出于同样的原因,因为有 …

c standards wchar-t widechar c-standard-library

4
推荐指数
1
解决办法
613
查看次数

关于操作数求值顺序的矛盾

当我从 deitel c 学习 C 中的递归函数时,我读到了这句话:

标准 C 没有指定大多数运算符(包括 +)的操作数的计算顺序。

但书中也说:

'+' 从左到右的结合性

操作数的计算顺序:

操作数的计算顺序

谁能解释一下这是为什么?

c recursion operator-precedence operands c-standard-library

4
推荐指数
1
解决办法
84
查看次数

Windows 上的 stdlib.h 函数应包含哪些库?

我来自 Mac 世界,对 Windows 开发还很陌生。非常简单的问题:我需要在 Visual Studio 2010 中包含哪些库才能访问一些基本函数,例如 strtof() 或 snprintf()?获取这些链接器错误... #including <stdlib.h>、、<ctype.h><string.h>

c windows c-standard-library

3
推荐指数
1
解决办法
5558
查看次数

为什么putchar(),fputc()和putc()的参数类型不是char?

有谁知道为什么参数类型的putchar()fputc()putc()不是char,但参数类型的putwchar()fputwc()并且putwc()wchar_t?另请参阅

c standards glibc c-standard-library

3
推荐指数
1
解决办法
637
查看次数

memccpy 如何处理大整数值?

根据man 3 memccpy函数memccpy定义如下:

概要

#include <string.h>

void *memccpy(void *dest, const void *src, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

描述

memccpy()函数将不超过n字节的内存区域复制src到内存区域,并在找到dest字符时停止。c

如果内存区域重叠,则结果不确定。

让我困惑的是memccpy复制字节并在找到字符n时停止。但是,该函数需要作为参数。那么如果我使用以下值调用会发生什么: cint cmemccpy

memccpy(&x, &y, 0xffffff76, 100);
Run Code Online (Sandbox Code Playgroud)

这里要检查的值对于 来说太大了char。这个案子应该有效吗?

c c-standard-library

3
推荐指数
1
解决办法
321
查看次数

我可以禁用或忽略 Apple 对 C 标准头文件的添加吗?

我正在开发一个 C 应用程序,我希望它具有合理的可移植性。它可以在 Linux 上使用 gcc 和 clang 以及在 Windows 上使用 MSVC 构建。访问 Mac 后,我尝试使用命令行工具进行构建。

它无法编译,因为我的代码声明了一个函数,isnumber而 Apple 的ctype.h头文件也声明了一个 (non standard?) isnumber。我可以重命名我的函数,这样它就不会发生冲突,但是有没有办法通过禁用或忽略所有或特定的 Apple 添加到标准标头来避免这种情况?例如,是否有编译器选项或预处理器编译指示来忽略它们?

isnumber不知道检查字符类。下面是重现该问题的代码 - 它可以用 clang/Linux 和 MSVC/Windows 编译,但不能在 Mac 上编译( - 它不是实际代码)。

#include <ctype.h>
#include <stdio.h>

char *isnumber(void);

int main(void)
{
    char *opt = "A";

    if (isupper(*opt))
        printf("THE IS NUMBER IS: %s\n", isnumber());
    else
        printf("The IS number is: %s\n", isnumber());

    return 0;
}

char *isnumber(void)
{
    return "IS-123";
} …
Run Code Online (Sandbox Code Playgroud)

c clang c-standard-library xcode-command-line-tools

2
推荐指数
1
解决办法
118
查看次数

C++ 中包含的 C 标准库函数会抛出异常吗?

在下面的代码中,作者指出new operator函数调用可能会导致异常,因此此实现不是异常安全的,因为对象状态已在第一行中更改。

String &String::operator =( const char *str ) {
    // state is changed
    delete [] s_;                                        

    if( !str ) str = "";

    // exception might occur because of new operator
    s_ = strcpy( new char[ strlen(str)+1 ], str );

    return *this;
}
Run Code Online (Sandbox Code Playgroud)

在阅读时,我想知道 C 库函数会在 C++ 中抛出异常吗?我知道 C 中没有例外,但由于我们使用的是 C++ 编译器,因此可能会有例外。

那么,我们可以将 C 标准库函数视为异常安全的函数调用吗?

谢谢你。

顺便说一句,为了记录,实现上述功能的正确方法(异常安全)如下。

String &String::operator =( const char *str ) {
    if( !str ) str = "";
    char *tmp = strcpy( new char[ strlen(str)+1 …
Run Code Online (Sandbox Code Playgroud)

c++ exception exception-safe exception-safety c-standard-library

1
推荐指数
1
解决办法
922
查看次数

为什么这个正双的绝对值等于零?

我有一个功能工作vector <vector <double> >.在某些时候,我想在比较中使用元素的绝对值,并且我得到了错误的行为,所以我放入以下调试行:

std::cout << M[3][2] << " " << abs(M[3][2]) << "\n";
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,输出是:

0.667 0
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

c++ floating-point c-standard-library

0
推荐指数
1
解决办法
151
查看次数

将C函数在C标准库中定义为宏

我一直在C头上阅读The Open Group Base Specifications和Posix Programmers手册页,这个短语重新出现了"以下内容将被声明为函数,也可能被定义为宏",我不确定这意味着什么.从声明的函数创建宏有什么意义.那不就是创建命名空间冲突吗?你也为什么要这样做呢?

c posix c-standard-library

0
推荐指数
1
解决办法
345
查看次数

如何在 macOS 中找到 printf 的源代码?

对不起,我的英语不好。

我在 M1 Pro MacBook Pro 中使用 macOS 12.3

我想了解C标准库中printf的源代码。

我可以在 usr/include 目录中找到 stdio.h 文件。

但我在同一目录中找不到 printf.c 或 stdio.c 文件。

而且我认为 Apple Open Source 的 printf.c 太复杂,看起来不像 macOS 中的真实代码,对我没有帮助。Apple 开源 printf.c 代码真的在 macOS 中使用吗?

https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html

c macos printf stdio c-standard-library

-1
推荐指数
1
解决办法
350
查看次数

如何确定返回字符指针是否需要在C标准库函数中空闲?

我在C程序开发方面经验不多.正如我在标题中所描述的,如何确定返回字符指针是否需要在C标准库函数中空闲?对于例子,做我需要释放函数的返回指针getenvstdlib.hstrstrstring.h中?我在文档中找不到任何描述.

提前致谢.

c free pointers c-standard-library

-2
推荐指数
1
解决办法
989
查看次数