- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
static const vs #define 并没有完全回答这个问题。或#defining constants in C++ .
当我用 C 进行大量编程时,ANSI C 是全新的。我们主要使用#define 来定义常量。我已意识到这不再是最佳实践 ( https://codereview.stackexchange.com/questions/123848/verifying-e-mail-address-in-c/123856#123856 )。
使用#define我可以使用以前的常量来定义当前常量,一个例子是
#define EMAIL_CHAR_ARRAY_SIZE 40
#define GOOD_EMAIL_ADDRESS 1
#define BAD_EMAIL_ADDRESS 0
#define MIMIMUM_USER_NAME_LENGTH 1
#define AT_SIGN_LENGTH 1
#define DOT_LENGTH 1
#define MINIMUM_DOMAIN_LENGTH 1
#define MINIMUM_ROOT_DOMAIN_LENGTH 2
#define MINIUMUM_EMAIL_LENGTH MIMIMUM_USER_NAME_LENGTH + AT_SIGN_LENGTH + MINIMUM_DOMAIN_LENGTH + MINIMUM_ROOT_DOMAIN_LENGTH
我有一个程序(如下),我尝试使用 static const 而不是 #define,但是当我尝试使用前面的常量使用 static const 时,常量 MINIUMUM_EMAIL_LENGTH 无法编译。有没有办法在静态 const TYPE 声明中使用先前定义的常量?
const_testemail.c:12:5: error: initializer element is not constant
static const int MINIUMUM_EMAIL_LENGTH = (MIMIMUM_USER_NAME_LENGTH + AT_SIGN_LENGTH + MINIMUM_DOMAIN_LENGTH + MINIMUM_ROOT_DOMAIN_LENGTH);
#include <stdio.h>
#include <string.h>
static const int EMAIL_CHAR_ARRAY_SIZE = 40;
static const int GOOD_EMAIL_ADDRESS = 1;
static const int BAD_EMAIL_ADDRESS = 0;
static const int MIMIMUM_USER_NAME_LENGTH = 1;
static const int AT_SIGN_LENGTH = 1;
static const int DOT_LENGTH = 1;
static const int MINIMUM_DOMAIN_LENGTH = 1;
static const int MINIMUM_ROOT_DOMAIN_LENGTH = 2;
/* Doesn't compile
* static const int MINIUMUM_EMAIL_LENGTH = MIMIMUM_USER_NAME_LENGTH + AT_SIGN_LENGTH + MINIMUM_DOMAIN_LENGTH + MINIMUM_ROOT_DOMAIN_LENGTH;
* */
#define MINIUMUM_EMAIL_LENGTH (MIMIMUM_USER_NAME_LENGTH + AT_SIGN_LENGTH + MINIMUM_DOMAIN_LENGTH + MINIMUM_ROOT_DOMAIN_LENGTH)
int isEmailAddressProper(const char EmailAddress[EMAIL_CHAR_ARRAY_SIZE])
{
int EmailAddressIsGood = GOOD_EMAIL_ADDRESS;
int LengthOfEmailAddress;
char *AtSignLocation, *pos2;
int rootDomainLength;
LengthOfEmailAddress = strlen(EmailAddress);
if (LengthOfEmailAddress < MINIUMUM_EMAIL_LENGTH)
{
printf("The length of the email address is less than the minimum lenght %d\n", MINIUMUM_EMAIL_LENGTH);
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
}
AtSignLocation = strchr(EmailAddress, '@'); /* get the first instance of @ */
if (!AtSignLocation)
{
printf("There is no @ in the email address\n");
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
return EmailAddressIsGood;
}
if (AtSignLocation == EmailAddress) { /* Is @ the first character? */
printf("There is no user name in the email address, @ is the first character\n");
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
}
pos2 = strrchr(EmailAddress, '@'); /* find any other @ */
if ((pos2) && (AtSignLocation != pos2)) {
printf("There is more than 1 @ in the email address\n");
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
}
pos2 = strrchr(EmailAddress, '.'); /* get the last instance of '.' */
if (AtSignLocation > pos2) /* is . before @ ? */
{ printf("There is no root domain in the email address\n");
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
}
pos2++;
rootDomainLength = LengthOfEmailAddress - ((int)(pos2 - EmailAddress));
/* if root domain less than length 2 */
if (rootDomainLength < MINIMUM_ROOT_DOMAIN_LENGTH)
{
printf("The root domain length (%d) is less than the minimum length required (%d) in the email address\n", rootDomainLength, MINIMUM_ROOT_DOMAIN_LENGTH);
EmailAddressIsGood = BAD_EMAIL_ADDRESS;
}
return EmailAddressIsGood;
}
void GetAndValidateEmailAddress(char EmailAddress[EMAIL_CHAR_ARRAY_SIZE])
{
int EmailAddressIsGood = BAD_EMAIL_ADDRESS;
char TempEmail[EMAIL_CHAR_ARRAY_SIZE];
while (!EmailAddressIsGood)
{
scanf("%39s", TempEmail);
EmailAddressIsGood = isEmailAddressProper(TempEmail);
if (!EmailAddressIsGood) {
printf("The email address is not in the proper format, please re-enter the email address\n");
}
}
strcpy(EmailAddress, TempEmail);
}
main()
{
char EmailAddress[EMAIL_CHAR_ARRAY_SIZE];
printf("Please enter the email address\n");
GetAndValidateEmailAddress(EmailAddress);
printf("The email address you entered is %s\n", EmailAddress);
}
最佳答案
除了枚举常量(始终为int
类型)之外,C 没有符号常量。 #define
是一个宏,是预处理器的一部分。它是实际 C 语言编译之前的文本替换。
const
限定变量在语义上仍然是变量。限定符是程序员保证他不会改变这个值。编译器可能依赖此保证。破坏契约会引发未定义的行为,但运行时环境不一定会强制执行。
文件级别的静态初始化程序和数组索引需要常量表达式,因此会出现错误。简而言之,常量表达式必须在编译时产生常量值,因此不能使用变量。
请注意,函数中的数组参数也有类似的问题。但在这里你可以使用可变长度数组。但是,您可以使用空长度 ([]
) 或显式地将长度作为前面的参数传递;全局变量不起作用:
int isEmailAddressProper(size_t len, const char EmailAddress[len])
<小时/>
C++ 是一种不同的语言,具有相似的语法/语法,即使对于相同的语法也有相当不同的语义。您通常无法将一种语言的知识应用到另一种语言中。
关于c - 如何使用 C 中先前定义的常量来定义静态常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36237841/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!