c - 是否可以在预处理时或编译时修改 "function call"

标签 c visual-studio-2010 macros preprocessor-directive

第一个问题:是否可以调用带有某些参数的函数,并且在编译后在预处理时或编译时将其修改为其他内容

#define func(a,b) func(a,sizeof(a),b)

有些人可能会想为什么会出现这样的需求。

实际上,我正在使用 visual studio 2010 在 Windows 中移植代码,并且有一些函数已被弃用,例如 strcpy()、strcat() 等。它说要改用 strcpy_s()。

我知道我可以使用 #pragma disable(warning: ) 或通过提供如下标志来抑制它:

_CRT_NONSTDC_NO_DEPRRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS

但我不想忽视或压制它们。

我试图简单地替换字符串而不是使用忽略:

#define strcpy strcpy_s

如这里http://msdn.microsoft.com/en-us/library/td1esda9.aspx我读到如果我不提供第二个参数,就不会有参数不匹配。

我的意思是如果我这样使用应该没问题:

#define strcpy strcpy_s
strcpy(dest,src);

但事实并非如此。它仍然产生警告。

strcpy_s 的定义是:

errno_t strcpy_s(
   char *strDestination,
   size_t numberOfElements,
   const char *strSource 
);

第二个问题: 第一个参数是一个指向动态分配内存的指针,所以我如何才能得到这个指针指向的内存大小。虽然我读到它不可行,但必须有某种方式(希望如此)。

顺便问一下,_countof(var) 是什么?

最佳答案

这些函数已弃用。 Microsoft 试图通过错误地声称它们已被弃用来诱使您编写特定于 Microsoft 的代码,即使 ISO WG14 委员会(对它们负责)没有做出这样的声明。

定义三个 _CRT 宏应该被视为将编译器置于“有点接近标准”模式的正确方法,就像 /Za 一样。

关于c - 是否可以在预处理时或编译时修改 "function call",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886363/

相关文章:

c++ - 比较 LLVM 值的类型

c# - 如何使用正则表达式删除 aspx 页面源代码中的 CSS 类?

regex - MSBuild FileUpdate 目标的 ReplacementText 字符串中的双引号出现问题

C - 系统函数总是返回 -1

c - “%d”需要类型为 'int' 的参数,但参数 2 的类型为 'long unsigned int' [-Wformat=]

c - 正确编译后如何让我的 Makefile 发出声音?

c++ - 为什么迭代器在 VS2010 中导致调试非常缓慢,即使 _HAS_ITERATOR_DEBUGGING、_SECURE_SCL、_SECURE_SCL_THROWS 设置为 0

objective-c - 'va_start' 用于具有固定参数的函数

macos - 如何在 Mac 上的浏览​​器中编写键盘点击脚本

python - 将 Libre/Star/Openoffice Basic 宏转换为 python - 对象类型问题