我正在使用MSVC来编译一些C代码,这些代码使用标准库函数,例如和其他函数getenv(),sprintf并/W3设置了警告.MSVC告诉我:
'getenv':此函数或变量可能不安全.请考虑使用_dupenv_s.要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS
问题:
char的签名不是标准化的.因此有signed char和unsigned 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会发生什么)
而没有明确的类型转换使其工作的事情是自动升级char到int.
此外,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_t和signed wchar_t类型(出于同样的原因,因为有 …
当我从 deitel c 学习 C 中的递归函数时,我读到了这句话:
标准 C 没有指定大多数运算符(包括 +)的操作数的计算顺序。
但书中也说:
'+' 从左到右的结合性
操作数的计算顺序:
谁能解释一下这是为什么?
我来自 Mac 世界,对 Windows 开发还很陌生。非常简单的问题:我需要在 Visual Studio 2010 中包含哪些库才能访问一些基本函数,例如 strtof() 或 snprintf()?获取这些链接器错误... #including <stdlib.h>、、<ctype.h><string.h>
根据man 3 memccpy函数memccpy定义如下:
概要
Run Code Online (Sandbox Code Playgroud)#include <string.h> void *memccpy(void *dest, const void *src, int c, size_t n);描述
该
memccpy()函数将不超过n字节的内存区域复制src到内存区域,并在找到dest字符时停止。c如果内存区域重叠,则结果不确定。
让我困惑的是memccpy复制字节并在找到字符n时停止。但是,该函数需要作为参数。那么如果我使用以下值调用会发生什么: cint cmemccpy
memccpy(&x, &y, 0xffffff76, 100);
Run Code Online (Sandbox Code Playgroud)
这里要检查的值对于 来说太大了char。这个案子应该有效吗?
我正在开发一个 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) 在下面的代码中,作者指出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
我有一个功能工作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头上阅读The Open Group Base Specifications和Posix Programmers手册页,这个短语重新出现了"以下内容将被声明为函数,也可能被定义为宏",我不确定这意味着什么.从声明的函数创建宏有什么意义.那不就是创建命名空间冲突吗?你也为什么要这样做呢?
对不起,我的英语不好。
我在 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程序开发方面经验不多.正如我在标题中所描述的,如何确定返回字符指针是否需要在C标准库函数中空闲?对于例子,做我需要释放函数的返回指针getenv在stdlib.h和strstrstring.h中?我在文档中找不到任何描述.
提前致谢.